NSTableHeaderView可防止自动布局在拆分视图中调整滚动视图的大小

时间:2012-07-31 10:21:45

标签: cocoa interface-builder nssplitview autolayout

问题:为什么有标题视图会阻止滚动视图通过自动布局调整大小?

我正在尝试将自定义视图嵌入到滚动视图中,而滚动视图又包含在拆分视图中。我在Xcode 4.5 DP 4中使用Interface Builder创建了以下视图层次结构,但Xcode 4.4中也出现了同样的问题。

NSWindow
  NSView (content view of the window)
    NSSplitView
      NSView (split view panel)
      NSView (split view panel)
        NSScrollView
          TestView (my custom view)

现在,如果TestView提供了NSTableHeaderView(通过-headerView)属性,则拆分视图分隔符不能一直拖动到底部(或右侧)以隐藏TestView但停止到TestView的初始宽度或高度的边界。如果-headerView属性返回nil,则可以自由拖动分隔符。

每次都可以重现,只需创建一个新的Cocoa应用程序项目,添加视图并运行项目。步骤:

  1. 创建一个新的Cocoa应用程序项目
  2. 使用headerView属性创建TestView类,该属性返回NSTableHeaderView实例。
  3. 编辑MainMenu.xib并添加拆分视图
  4. 添加自定义视图并将其设为TestView
  5. 选择编辑器 - >嵌入 - >滚动视图
  6. 运行项目
  7. (未触及约束或其他Interface Builder菜单)

    TestView.m:

    @implementation TestView {
        NSTableHeaderView *_header;
    }
    
    - (NSTableHeaderView *)headerView
    {
        if (!_header) {
            _header = [[NSTableHeaderView alloc]
                       initWithFrame:NSMakeRect(0.0, 0.0, 100.0, 17.0)];
        }
    
        return _header;
    }
    
    @end
    

    任何指针,我该怎么做才能让拆分视图分割器再次移动?

2 个答案:

答案 0 :(得分:1)

在方便的类中实现此NSSplitViewProtocol方法:

- (BOOL)splitView:(NSSplitView *)splitView shouldAdjustSizeOfSubview:(NSView *)subview {return TRUE;}

确保将拆分视图的委托输出连接到类对象。

现在可以将拆分视图调整为任何大小。

答案 1 :(得分:1)

我的解决方案是手动删除表头的自动调整约束:

NSTableHeaderView *headerView = outlineView.headerView;
NSView *headerViewSuperview = headerView.superview;
[headerViewSuperview removeFromSuperview];
headerView.superview.translatesAutoresizingMaskIntoConstraints = NO;
[scrollView addSubview:headerViewSuperview];