samuke
samuke

Reputation: 460

NSTableHeaderView prevents auto layout from resizing scroll view in a split view

The question: Why having a header view prevents scroll view from being resized by auto layout?

I'm trying to embed my custom view in a scroll view, which in turn is enclosed in a split view. I've created the following view hierarchy using Interface Builder in Xcode 4.5 DP 4, but the same problem seems to happen also in Xcode 4.4.

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

Now, if TestView provides a NSTableHeaderView (via -headerView) property the split view divider cannot be dragged all the way to bottom (or right) to hide the TestView but stops to the boundary of the initial width or height of the TestView. If the -headerView property returns nil, the divider can be dragged freely.

This can be reproduced every time, just by creating a fresh Cocoa application project, adding the views and running the project. The steps:

  1. Create a new Cocoa Application project
  2. Create TestView class with headerView property which returns a NSTableHeaderView instance.
  3. Edit MainMenu.xib and add a split view
  4. Add custom view and make it TestView
  5. Choose Editor -> Embed in -> Scroll view
  6. Run the project

(No constraints or other Interface Builder menus touched)

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

Any pointers, what should I do to get the split view divider moving again?

Upvotes: 3

Views: 1152

Answers (2)

Stephan Michels
Stephan Michels

Reputation: 1072

My solution was to manually remove the autoresizing constraints of the table header:

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

Upvotes: 1

Elmer Cat
Elmer Cat

Reputation: 144

Implement this NSSplitViewProtocol method in a convenient class:

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

Make sure to connect the split view's delegate output the class object.

The split view can now be adjusted to any size.

Upvotes: 1

Related Questions