2013-03-12 28 views
5

Tôi đang cố gắng tạo một NSTableView bên trong một NSScrollView (cấu hình tiêu chuẩn, có nghĩa là) bằng mã, sử dụng bố cục tự động. Tôi không thể tìm ra cách để thực hiện công việc này.Khung của NSTableView bên trong một NSClipView/NSScrollView sử dụng bố cục tự động

Dưới đây là loadView của tôi:

- (void)loadView 
{ 
    NSView *view = [[NSView alloc] init]; 

    NSScrollView *tableScroll = [[NSScrollView alloc] init]; 
    NSTableView *fileTable = [[NSTableView alloc] init]; 
    [tableScroll setDocumentView:fileTable]; 
    [tableScroll setHasVerticalScroller:YES]; 
    [tableScroll setHasHorizontalScroller:NO]; 
    fileTable.delegate = self; 
    fileTable.dataSource = self; 
    [fileTable setHeaderView:nil]; 
    [fileTable setAllowsColumnReordering:NO]; 

    NSTableColumn *column = [[NSTableColumn alloc] initWithIdentifier:@"column1"]; 
    [fileTable addTableColumn:column]; 

    [tableScroll setTranslatesAutoresizingMaskIntoConstraints:NO]; 
    [fileTable setTranslatesAutoresizingMaskIntoConstraints:NO]; 

    [view addSubview:tableScroll]; 

    NSDictionary *topViews = NSDictionaryOfVariableBindings(tableScroll); 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[tableScroll]|" options:0 metrics:nil views:topViews]]; 
    [view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|[tableScroll]|" options:0 metrics:nil views:topViews]]; 

    self.fileTable = fileTable; 

    self.view = view; 
} 

gì xảy ra là khung xem bảng của tôi sẽ luôn bằng với giới hạn của NSClipView. Khung nhìn nằm bên trong một cửa sổ và được thay đổi kích thước với nó, và khi tôi làm điều đó nó sẽ thay đổi kích thước scrollview, xem clip và bảng, nhưng tôi không bao giờ có thể cuộn bất cứ nơi nào.

Nhìn vào các ràng buộc tôi nhận được, NSScrollView bị ràng buộc đặt chế độ xem clip để lấp đầy, chế độ xem clip không có ràng buộc nào và chế độ xem bảng có một loạt các ràng buộc liên quan đến NSTableRowViews bên trong.

Nếu tôi thêm một ràng buộc như |[fileTable(>=500)] vào giao diện clip, tôi sẽ nhận được 500 pixel của NSTableView, nhưng rõ ràng là tôi không muốn làm điều đó.

+0

Nếu tôi đặt mặt nạ tự động hóa cho 'tableScroll', hãy gọi' setTranslatesAutoresizingMaskIntoConstraints: YES' trên 'tableScroll' và' fileTable' và xóa hai lệnh 'addConstraints', nó hoạt động ok và tôi thấy' NSAutoresizingMaskLayoutConstraint' trên giao diện clip chỉ định kích thước chính xác 'fileTable' cần. –

Trả lời

1

Mặc dù điều này đã được trả lời bởi người đăng trong các ý kiến ​​ở trên, tôi nghĩ rằng tôi sẽ đặt câu trả lời ở đây (đã chạy vào cùng một vấn đề). Nếu bạn đang sử dụng bố cục tự động, bạn thường sẽ bỏ chọn "Dịch Mặt nạ thành Ràng buộc" trong xib. Tuy nhiên, đối với các lớp như NSScrollViewNSTableView, thông thường bạn nên để họ quản lý lượt xem nội bộ của riêng mình bằng cách đặt thuộc tính translatesAutoresizingMaskIntoConstraints thành YES. Bạn vẫn có thể đặt các ràng buộc là bên ngoài cho các chế độ xem này, tức là để thay đổi kích thước liên quan đến người giám sát của họ.

Nếu bạn đặt translatesAutoresizingMaskIntoConstraints thành NO, thì bạn sẽ cần cung cấp ràng buộc cho tất cả các chế độ xem nội bộ, trừ khi bạn cần hành vi tùy chỉnh cụ thể (hầu như không bao giờ), bạn sẽ không muốn làm. Đây là vấn đề cụ thể ở trên.

Tác dụng phụ rõ ràng của việc không cài đặt đúng cách này là bảng (ví dụ) sẽ không cuộn đúng cách những gì hiển thị trong chế độ xem.

Các vấn đề liên quan