在Interface Builder中禁用NSSplitView的Autolayout

时间:2017-01-12 10:09:22

标签: cocoa autolayout interface-builder nssplitview

在我的Storyboard中使用NSSplitViewController,我想覆盖包含的拆分视图的行为。

通过实现一些关于滑块最大约束的NSSplitViewDelegate方法,我得到了这个异常:

2017-01-12 11:05:45.873814 iCache[3399:659731] [General] SplitViewController's splitView is unable to use autolayout because the SplitViewController overrides an incompatible delegate method.
2017-01-12 11:05:45.874089 iCache[3399:659731] [General] (
    0   CoreFoundation                      0x00007fffb5d9ee7b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x00007fffca989cad objc_exception_throw + 48
    2   CoreFoundation                      0x00007fffb5da3b82 +[NSException raise:format:arguments:] + 98
    3   Foundation                          0x00007fffb77edd50 -[NSAssertionHandler handleFailureInMethod:object:file:lineNumber:description:] + 195
    4   AppKit                              0x00007fffb389ca29 -[NSSplitView _splitViewUseConstraintBasedLayout] + 355
    5   AppKit                              0x00007fffb389c894 -[NSSplitView(NSSplitViewDividerViews) _canUseDividerViewsAsSubviews] + 74
    6   AppKit                              0x00007fffb389c0f7 -[NSSplitView(NSSplitViewDividerViews) _updateDividerViews] + 36
    7   AppKit                              0x00007fffb389dd41 -[NSSplitViewController _updateSplitView:withBlock:] + 51
    8   AppKit                              0x00007fffb389dc89 -[NSSplitViewController viewDidLoad] + 144
    9   AppKit                              0x00007fffb3896283 -[NSViewController _sendViewDidLoad] + 97
    10  CoreFoundation                      0x00007fffb5d17889 -[NSSet makeObjectsPerformSelector:] + 217
    11  AppKit                              0x00007fffb3814902 -[NSIBObjectData nibInstantiateWithOwner:options:topLevelObjects:] + 1389
    12  AppKit                              0x00007fffb391d436 -[NSNib _instantiateNibWithExternalNameTable:options:] + 696
    13  AppKit                              0x00007fffb391d06a -[NSNib _instantiateWithOwner:options:topLevelObjects:] + 143
    14  AppKit                              0x00007fffb403f34a -[NSStoryboard instantiateControllerWithIdentifier:] + 234
    15  AppKit                              0x00007fffb3805bb7 NSApplicationMain + 780
    16  iCache                              0x00000001000127f4 main + 84
    17  libdyld.dylib                       0x00007fffcb26d255 start + 1
)

显然这是由于Autolayout用于拆分视图。 有没有办法在Interface Builder中禁用此NSSplitView的Autolayout?

1 个答案:

答案 0 :(得分:3)

启用/禁用自动布局

您可以在 File Inspector 下的Interface Builder中禁用每个XIB文件的自动布局。

您应该能够通过视图translatesAutoresizingMaskIntoConstraints控制每个视图的自动布局。

为什么它不起作用

根据OS X 10.11发行说明,有些方法不能与自动布局结合使用。

请参阅notes中的摘录。

  

自动布局NSSplitView改进

     

在10.8中,NSSplitView正确地考虑了应用于其子视图的约束,例如它们的最小视图宽度。还有用于控制保持优先级的新API,它们确定分割视图保持其大小的NSLayoutPriority以及分割视图本身增长或缩小时哪些视图更改大小。

     
      
  • (NSLayoutPriority)holdingPriorityForSubviewAtIndex:(NSInteger)subviewIndex;
  •   
  • (void)setHoldingPriority:(NSLayoutPriority)priority forSubviewAtIndex:(NSInteger)subviewIndex;
  •   
     

为了利用这些改进,您不得实现以下任何NSSplitViewDelegate方法:

     
      
  • splitView:constrainMinCoordinate:ofSubviewAt:
  •   
  • splitView:constrainMaxCoordinate:ofSubviewAt:
  •   
  • splitView:resizeSubviewsWithOldSize:
  •   
  • splitView:shouldAdjustSizeOfSubview:
  •   
     

这些方法与自动布局不兼容。您通常可以通过自动布局实现其效果。