正确调整视图上的行大小

具有动态高度的行的基于视图的NSTableView在更改表视图大小时不会调整其行的大小。 当行高从表视图的宽度派生时(认为填充列和换行从而扩展行大小的文本块),这是一个问题。

我一直试图让NSTableView调整它的行大小,只要它改变大小但是经历了一点成功:

  • 如果我通过查询enumerateAvailableRowViewsUsingBlock:来仅调整可见行的大小,则某些不可见的行不会被调整大小,因此当用户滚动并显示这些行时,会显示旧的高度。
  • 如果我调整所有行的行数,当行数很多时(每个窗口在我的1.8Ghz i7 MacBook Air中调整1000行后大约需要1秒的延迟)就会变得非常慢。
  • 任何人都可以帮忙?

    这是我检测表视图大小变化的地方 - 在表视图的委托中:

    - (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];
        }
    }
    

    以下是上面发布的通知的处理程序,其中可见行的大小调整为:

    -(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];   
    }
    

    调整所有行的替代实现如下所示:

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

    注意:这个问题与基于View的NSTableView有些相关,它们的行具有动态高度,但更多地专注于响应表视图的大小更改。


    我刚刚经历了这个确切的问题。 我所做的是监视滚动视图的内容视图的NSViewBoundsDidChangeNotification

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

    并在处理程序中,获取可见行并调用noteHeightOfRowsWithIndexesChange :. 我这样做时禁用了动画,所以用户在调整大小时看不到行晃动,因为视图进入表格

    - (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];
    }
    

    这必须迅速执行,所以桌子很好地滚动,但它的工作对我来说非常好。

    链接地址: http://www.djcxy.com/p/49961.html

    上一篇: Correctly resizing rows on view

    下一篇: Should I use view constraints or minimum window size?