2012-08-22 16 views
9

Chế độ xem NSTableView dựa trên chế độ xem với các hàng có chiều cao động không thay đổi kích thước các hàng khi kích thước chế độ xem bảng được thay đổi. Đây là một vấn đề khi chiều cao hàng có nguồn gốc từ chiều rộng của bảng xem (nghĩ rằng khối văn bản điền vào một cột và kết thúc tốt đẹp do đó mở rộng kích thước hàng).Thay đổi kích thước hàng chính xác trên NSTableView

Tôi đã cố gắng để có được NSTableView để thay đổi kích thước hàng của mình bất cứ khi nào nó thay đổi kích thước nhưng đã có kinh nghiệm ít thành công:

  • Nếu tôi thay đổi kích thước chỉ có các hàng có thể nhìn thấy bằng cách truy vấn enumerateAvailableRowViewsUsingBlock:, một số các hàng không nhìn thấy được không được thay đổi kích cỡ và do đó được hiển thị với chiều cao cũ khi người dùng cuộn và hiển thị các hàng này.
  • Nếu tôi thay đổi kích thước tất cả các hàng, nó sẽ trở nên chậm đáng kể khi có nhiều hàng (khoảng 1 giây trễ sau mỗi cửa sổ đổi kích thước cho 1000 hàng trong 1,8Ghz i7 MacBook Air).

Bất kỳ ai cũng có thể trợ giúp?

Đây là nơi tôi phát hiện xem bảng thay đổi kích thước - trong giao diện bảng của đại biểu:

- (void)tableViewColumnDidResize:(NSNotification *)aNotification 
{ 
    NSTableView* aTableView = aNotification.object; 
    if (aTableView == self.messagesView) { 
     // coalesce all column resize notifications into one -- calls messagesViewDidResize: below 

     NSNotification* repostNotification = [NSNotification notificationWithName:BSMessageViewDidResizeNotification object:self]; 
     [[NSNotificationQueue defaultQueue] enqueueNotification:repostNotification postingStyle:NSPostWhenIdle]; 
    } 
} 

Trong khi đây là xử lý các thông báo đăng tải trên, nơi các hàng có thể nhìn thấy được thay đổi kích cỡ:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView; 

    NSMutableIndexSet* visibleIndexes = [NSMutableIndexSet new]; 
    [messagesView enumerateAvailableRowViewsUsingBlock:^(NSTableRowView *rowView, NSInteger row) { 
     if (row >= 0) { 
      [visibleIndexes addIndex:row]; 
     } 
    }]; 
    [messagesView noteHeightOfRowsWithIndexesChanged:visibleIndexes]; 
} 

Việc thực hiện thay thế mà thay đổi kích thước tất cả các hàng trông như thế này:

-(void)messagesViewDidResize:(NSNotification *)notification 
{ 
    NSTableView* messagesView = self.messagesView;  
    NSIndexSet indexes = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(0,messagesView.numberOfRows)];  
    [messagesView noteHeightOfRowsWithIndexesChanged:indexes]; 
} 

Lưu ý: Câu hỏi này có phần liên quan đến View-based NSTableView with rows that have dynamic heights nhưng tập trung hơn vào việc phản hồi thay đổi kích thước của chế độ xem bảng.

Trả lời

11

Tôi vừa trải qua vấn đề chính xác này. Những gì tôi đã làm là theo dõi NSViewBoundsDidChangeNotification cho xem di chuyển của xem nội dung

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewContentBoundsDidChange:) name:NSViewBoundsDidChangeNotification object:self.scrollView.contentView]; 

và trong xử lý, có các hàng có thể nhìn thấy và gọi noteHeightOfRowsWithIndexesChange :. Tôi vô hiệu hóa hình ảnh động khi làm điều này vì vậy người dùng không nhìn thấy các hàng ngọ nguậy trong thay đổi kích thước như quan điểm của đi vào bảng

- (void)scrollViewContentBoundsDidChange:(NSNotification*)notification 
{ 
    NSRange visibleRows = [self.tableView rowsInRect:self.scrollView.contentView.bounds]; 
    [NSAnimationContext beginGrouping]; 
    [[NSAnimationContext currentContext] setDuration:0]; 
    [self.tableView noteHeightOfRowsWithIndexesChanged:[NSIndexSet indexSetWithIndexesInRange:visibleRows]]; 
    [NSAnimationContext endGrouping]; 
} 

này phải thực hiện một cách nhanh chóng vì vậy các cuộn bảng độc đáo nhưng làm việc của nó rất tốt cho tôi.

+0

Đối với tôi, tôi đợi cho đến khi người dùng đã hoàn tất thay đổi kích thước rồi điều chỉnh lại chiều cao của hàng. – adib

+1

dường như chế độ xem nội dung dạng xem cuộn không đăng thông báo thay đổi, ngay cả sau khi gọi '[self.scrollView.contentView setPostsBoundsChangedNotifications: YES]' – adib

+1

có vẻ như NSViewFrameDidChangNotification hoạt động tốt hơn để thay đổi kích thước trực tiếp –