【问题标题】:Views not displaying correctly after adding them to NSStackView programmatically以编程方式将视图添加到 NSStackView 后视图无法正确显示
【发布时间】:2015-06-13 14:18:59
【问题描述】:

我正在尝试向 NSStackView 添加一些视图(本例中为 NSTextField):

我已将 NSStackView 实例添加到 XIB 文件中,并将其作为 widgets 链接到 Document 中。在 ...didLoadNib 我正在这样做:

NSTextField *tf = [[NSTextField alloc] init];
tf.stringValue = @"124";
[tf setFrameSize:NSMakeSize(100, 20)];
[widgets addView:tf inGravity:NSStackViewGravityLeading];
NSLog(@"%f - %d", NSHeight(tf.frame), [tf hasAmbiguousLayout]);

NSTextField *tf2 = [[NSTextField alloc] init];
tf2.stringValue = @"123";
[tf2 setFrameSize:NSMakeSize(100, 20)];
[widgets addView:tf2 inGravity:NSStackViewGravityLeading];
NSLog(@"%f - %d", NSHeight(tf2.frame), [tf2 hasAmbiguousLayout]);

TextFields 被放置到 StackView 中,但它们被放置在相同的位置,即第二个完全重叠。我仍然可以先通过[空格+tab]选择。

这是控制台输出:

2015-06-13 17:11:00.736 celty-test[62306:9217679] 20.000000 - 1
2015-06-13 17:11:00.739 celty-test[62306:9217679] Unable to simultaneously satisfy constraints:
(
    "<NSLayoutConstraint:0x608000084bf0 V:[NSStackViewSpacer:0x6080001834d0(>=8)]>",
    "<NSLayoutConstraint:0x608000084f10 V:[NSTextField:0x608000183330]-(0)-[NSStackViewSpacer:0x6080001834d0]>",
    "<NSLayoutConstraint:0x608000085460 V:[NSStackViewSpacer:0x6080001834d0]-(0)-[NSTextField:0x608000183400]>",
    "<NSAutoresizingMaskLayoutConstraint:0x608000084970 h=--& v=--& V:[NSTextField:0x608000183330]-(0)-|   (Names: '|':NSStackViewContainer:0x6000001a0700 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d30 h=--& v=--& V:[NSTextField:0x608000183400]-(0)-|   (Names: '|':NSStackViewContainer:0x6000001a0700 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d80 h=--& v=--& V:[NSTextField:0x608000183400(20)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000084bf0 V:[NSStackViewSpacer:0x6080001834d0(>=8)]>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.
2015-06-13 17:11:00.802 celty-test[62306:9217679] Unable to simultaneously satisfy constraints:
(
    "<NSLayoutConstraint:0x608000084f10 V:[NSTextField:0x608000183330]-(0)-[NSStackViewSpacer:0x6080001834d0]>",
    "<NSLayoutConstraint:0x608000085460 V:[NSStackViewSpacer:0x6080001834d0]-(0)-[NSTextField:0x608000183400]>",
    "<NSAutoresizingMaskLayoutConstraint:0x608000084970 h=--& v=--& V:[NSTextField:0x608000183330]-(0)-|   (Names: '|':NSStackViewContainer:0x6000001a0700 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d30 h=--& v=--& V:[NSTextField:0x608000183400]-(0)-|   (Names: '|':NSStackViewContainer:0x6000001a0700 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x608000084d80 h=--& v=--& V:[NSTextField:0x608000183400(20)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x608000085460 V:[NSStackViewSpacer:0x6080001834d0]-(0)-[NSTextField:0x608000183400]>

Set the NSUserDefault NSConstraintBasedLayoutVisualizeMutuallyExclusiveConstraints to YES to have -[NSWindow visualizeConstraints:] automatically called when this happens.  And/or, break on objc_exception_throw to catch this in the debugger.
2015-06-13 17:11:00.814 celty-test[62306:9217679] 20.000000 - 0

XIB 和结果截图:

StackView 没有添加任何约束。 StackView 应该是垂直的。将会有动态数量的文本字段添加到 stackview。

【问题讨论】:

  • Widget 有限制吗?您将两个文本字段都设置为小部件底部的重力,从调试器看起来就像您在文本字段之间添加了一个间距,但如果您想要它们需要固定到小部件的顶部底部可调整大小的小部件。喜欢"V:|[tf]-8-[tf2]|"
  • 我没有为 ScrollView 或 textfields 添加任何约束。

标签: objective-c cocoa nsstackview


【解决方案1】:

您需要将文本字段的translatesAutoresizingMaskIntoConstraints 属性设置为false。

通常,如果视图由其他代码放置,则不应这样做。也就是说,您希望堆栈视图决定该属性是打开还是关闭,因为它可以控制将其放入视图层次结构中。但是,在 10.10 之前,NSStackView 中存在与此相关的错误,因此您必须自己将其关闭。

线索是这组不可满足的约束包括NSAutoresizingMaskLayoutConstraint类型的约束。

【讨论】:

  • 非常感谢。进入 Cocoa 的第二天就已经发现了一个 bug。
  • 看起来这是在 10.11 上修复的,NSStackViewtranslatesAutoresizingMaskIntoConstraints 设置为 false。
  • 非常感谢!我刚刚花了几个小时试图让它工作并修复它。奇怪的是,我有另一个具有相同设置的堆栈视图,并且不这样做也可以正常工作...
  • 使用自动布局的 NIB/故事板中的非顶级视图已被 IB 关闭 translatesAutoresizingMaskIntoConstraints。大多数情况下,以编程方式创建的视图存在问题,尽管它也可能是来自 NIB/storyboard 的顶级视图,或者来自未设置为使用自动布局的 NIB/storyboard 的顶级视图。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多