我的主要内容是一个NSView,其中包含100个NSButton作为子视图的集合,垂直布局.按钮都相对于NSView和彼此都受到约束; NSView和所有NSButton都有translatesAutoresizingMaskIntoConstraints = NO set.我相信内容视图的代码很好(即没有模糊的布局等),因为如果我将主窗口的contentView设置为NSView,按钮会按预期显示.
但是,如果我将主窗口的contentView设置为NSScrollView,并将NSScrollView的documentView设置为NSView,则会出现显示问题.
在第一次显示时,我得到一个空白窗口 – 没有滚动条,没有:
NSScrollView具有translatesAutoresizingMaskIntoConstraints = NO.出于调试目的,我还将NSScrollView的背景颜色设置为蓝色,以便我可以确认在哪里布局 – 但是在任何地方都没有显示蓝色.
但是,只要我调整窗口大小,布局就会启动,我会得到一个NSScrollView主窗口的完整大小,蓝色背景和滚动条按预期方式:
我已经阅读了一些引用,表明问题是对作为NSScrollView一部分的clipView缺乏约束.在此基础上,我尝试在垂直和水平方向上设置约束[NSScrollView contentView]到[NSScrollView documentView]的约束(在左,右,顶部和底部有常数0,乘数1).当我这样做时,NSScrollView现在在第一次显示时可见,但它的大小错误.滚动不会滚动内部内容的整个高度 – 可滚动内容会滚动,就好像它与可见窗口的大小相同.最后,内容与窗口的标题栏重叠:
同样,一旦我调整窗口大小,约束就会启动,窗口会显示为我所期望的(请参阅上一个屏幕截图).所以,我认为额外的限制没有受到伤害,但它们似乎也没有添加任何东西.
更令人困惑的事情 – 如果我完全不使用按钮,只使用没有子视图的空NSView作为内容视图,我会在启动时获得完整的蓝色窗口,正如我所期望的那样.
那么 – 这里发生了什么?感觉我错过了强制评估按钮约束的调用;就是这种情况,或者是其他事情在这里发生了什么?
对于那些感兴趣的人 – 这是我的示例代码.它不是Objective C – 它是Python – 但语言绑定可以将Python方法名称转换为Objective C消息;原生ObjectiveC API的映射应该是显而易见的:
app = NSApplication.sharedApplication() app.setActivationPolicy_(NSApplicationActivationPolicyRegular) main_window = NSWindow.alloc().initWithContentRect_styleMask_backing_defer_( NSMakeRect(100,100,640,480),NSTitledWindowMask | NSClosableWindowMask | NSResizableWindowMask | NSMiniaturizableWindowMask,NSBackingStoreBuffered,False) scrollview = NSScrollView.alloc().init() scrollview.setHasVerticalScroller_(True) scrollview.setHasHorizontalScroller_(True) scrollview.setAutohidesScrollers_(True) scrollview.setBorderType_(NSNoBorder) scrollview.setTranslatesAutoresizingMaskIntoConstraints_(False) scrollview.backgroundColor = NSColor.blueColor() container = NSView.alloc().init() container.setTranslatesAutoresizingMaskIntoConstraints_(False) buttons = [ NSButton.alloc().init() for b in range(0,100) ] for i,button in enumerate(buttons): button.setBezelStyle_(NSRoundedBezelStyle) button.setButtonType_(NSMomentaryPushInButton) button.setTitle_(get_NSString('Button %s' % i)) button.setTranslatesAutoresizingMaskIntoConstraints_(False) container.addSubview_(button) if i == 0: container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_( button,NSLayoutAttributeTop,NSLayoutRelationEqual,container,1,50,)) else: container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_( button,NSLayoutAttributeBottom,buttons[i-1],)) container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_( button,NSLayoutAttributeLeft,NSLayoutAttributeRight,-50,)) container.addConstraint_(NSLayoutConstraint.constraintWithItem_attribute_relatedBy_toItem_attribute_multiplier_constant_( buttons[-1],)) scrollview.setDocumentView_(container) main_window.setContentView_(scrollview) main_window.makeKeyAndOrderFront_(None) app.activateIgnoringOtherApps_(True) app.run()
解决方法
某些Cocoa小部件不能很好地处理自动布局 – 特别是,我发现了顶级NSWindows和NSTabViewItems的问题;我猜其他小部件也可能受到影响.从本质上讲,这些是具有必须设置的顶级“视图”的“容器”小部件.如果“包含”窗口小部件是NSScrollView(它本身将包含其他窗口小部件),则“容器”窗口小部件很难为“包含”滚动视图建立大小.
修复方法是为将用作“包含”窗口小部件的视图重新启用translatesAutoresizingMaskIntoConstraints.在提供的示例中,在第10行创建的对象scroll_view是“包含”小部件;第15行调用setTranslatesAutoresizingMaskIntoConstraints的布尔值应为True,而不是False.
使用更新版本的OS / X时,这些问题会变得更好–Maickicks对NSWindow没有问题,但它仍然存在NSTabViewItem问题.但是,在较新版本的OS X上启用translatesAutoresizingMaskIntoConstraints似乎没有任何损害;所有你都失去了100%自动布局解决方案的理论纯度.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。