我一直在玩NSStackView(在OS X 10.9.4上),有点卡住了。本质上,我正在创建一个页脚视图,并向该页脚添加堆栈视图。我想将一些项目分组在页脚的左侧,将一些项目分组在右侧。我认为可以根据需要将视图分配给前后重力。但是,我似乎无法获得预期的效果。
NSView* footerView = [[NSView alloc] initWithFrame:CGRectZero];
footerView.translatesAutoresizingMaskIntoConstraints = NO;
self.footerView = footerView;
NSStackView* stackView = [[NSStackView alloc] init];
stackView.translatesAutoresizingMaskIntoConstraints = NO;
self.stackView = stackView;
[self.footerView addSubview:stackView];
NSTextField* firstTextField = [[NSTextField alloc] init];
firstTextField.translatesAutoresizingMaskIntoConstraints = NO;
firstTextField.bezeled = NO;
firstTextField.editable = NO;
firstTextField.stringValue = @"One";
self.firstTextField = firstTextField;
[self.stackView addView:firstTextField inGravity:NSStackViewGravityLeading];
NSTextField* secondTextField = [[NSTextField alloc] init];
secondTextField.translatesAutoresizingMaskIntoConstraints = NO;
secondTextField.bezeled = NO;
secondTextField.editable = NO;
secondTextField.stringValue = @"Two";
self.secondTextField = secondTextField;
[self.stackView addView:secondTextField
inGravity:NSStackViewGravityLeading];
NSTextField* thirdTextField = [[NSTextField alloc] init];
thirdTextField.translatesAutoresizingMaskIntoConstraints = NO;
thirdTextField.bezeled = NO;
thirdTextField.editable = NO;
thirdTextField.stringValue = @"Three";
self.thirdTextField = thirdTextField;
[self.stackView addView:thirdTextField inGravity:NSStackViewGravityLeading];
NSTextField* fourthTextField = [[NSTextField alloc] init];
fourthTextField.translatesAutoresizingMaskIntoConstraints = NO;
fourthTextField.bezeled = NO;
fourthTextField.editable = NO;
fourthTextField.stringValue = @"Four";
self.fourthTextFeild = fourthTextField;
[self.stackView addView:fourthTextField
inGravity:NSStackViewGravityTrailing];
NSTextField* fifthTextField = [[NSTextField alloc] init];
fifthTextField.translatesAutoresizingMaskIntoConstraints = NO;
fifthTextField.bezeled = NO;
fifthTextField.editable = NO;
fifthTextField.stringValue = @"Five";
self.fifthTextField = fifthTextField;
[self.stackView addView:fifthTextField
inGravity:NSStackViewGravityTrailing];
[self.window.contentView addSubview:footerView];
NSDictionary* views = @{
@"footerView" : self.footerView,
@"stackView" : self.stackView
};
[self.window.contentView
addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:[footerView(==30)]|"
options:0
metrics:nil
views:views]];
[self.window.contentView
addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|[footerView]|"
options:0
metrics:nil
views:views]];
[self.footerView
addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"H:|-[stackView]-|"
options:0
metrics:nil
views:views]];
[self.footerView
addConstraints:[NSLayoutConstraint
constraintsWithVisualFormat:@"V:|[stackView]|"
options:0
metrics:nil
views:views]];
如果我仅添加前三个textField,则它们将在开头区域正确地分组在一起。
但是,当我添加尾随区域视图时,前导区域中的视图会跳向尾随区域
从NSStackView的spacer属性的文档中,我看到了
这些约束共同导致以下典型的堆栈视图行为:在hasEqualSpacing属性设置为NO(默认值)且其拥抱优先级保留在NSLayoutPriorityDefaultLow(默认值)的堆栈视图中,重力区域内的视图保持固定彼此之间的距离(等于space属性的值),并且重力区域之间的距离随着堆栈视图沿其布局方向轴的增大和缩小而增大和缩小。
但是,这似乎没有发生。重力区域(前导区域)内的视图之间的间距不是恒定的,并且似乎没有将重力区域之间的距离增大/缩小,而是将其设置为间隔距离。
我想要的是在页脚的左侧(以默认距离隔开)出现一个,两个,三个,并在页脚的右侧出现四个,五个。我可以尝试通过使用两个不同的堆栈视图(一个用于前导区域,另一个用于尾随区域)来解决这个问题,但是,我认为使用单个堆栈视图和重力区域应该可以做到这一点。希望对此有一些指导。谢谢
的docsspacing
属性NSStackView
显示,重力区域之间的间隔设置为该spacing
值(默认为8个点),并且堆栈视图的配置在该方向上具有优先级(默认为NSLayoutPriorityDefaultLow
)。
如果包含文本字段优先级的内容低于该优先级,则自动布局系统将更喜欢拉伸其中一个而不是重力区域之间的间距。这就是为什么您的问题中所示的文本字段之一被拉伸的原因。(如果文本字段具有相同的内容优先级,则拉伸哪个文本字段是任意的,并且可以随时更改。)
如果文本字段的内容包含优先级等于堆栈视图的包含优先级,那么扩展的内容是任意的。它可以是文本字段之一,也可以是重力间区域间距。
正如您在答案中所指出的,您想使文本字段具有更高的内容优先级。不需要这样NSLayoutPriorityDragThatCanResizeWindow
。它可以高于堆栈视图的优先级。
正如您在回答中报告的那样,这与限制窗口缩小无关。
如果要让堆栈视图缩小到比其子视图指示的大小及其之间的间距窄的位置,则有两个选择。首先,你可以将其裁剪性优先级设置为东西小于NSLayoutPriorityWindowSizeStayPut
使用-setClippingResistancePriority:forOrientation:
。这将导致堆栈视图允许剪切或分离视图。发生哪种情况取决于设置的视图的可见性优先级setVisibilityPriority:forView:
。默认情况下,所有视图的可见性优先级为NSStackViewVisibilityPriorityMustHold
,这意味着它们不会分离,但会被裁剪。
因此,如果要分离视图,则应更改其可见性优先级。您应该对优先级进行排序,以指示要相对于其他视图(较高)首先分离的视图(较低的可见性优先级)。
另一种方法是将子视图的压缩阻力优先级设置为低于NSLayoutPriorityWindowSizeStayPut
。这意味着自动布局系统将压缩文本字段,通常将其用省略号(“…”)截断。您可能希望对文本字段的抗压缩优先级进行排序,以确定它们的压缩顺序,否则将是任意的(甚至可能会随时变化)。您可能还希望在文本字段上设置最小宽度限制,因为在某些时候,使文本字段可见但没有空间显示任何有意义的内容似乎很糟糕。
您可以通过使文本字段的压缩阻力低于堆栈视图的剪切阻力来结合这两种方法。文本字段的最小宽度限制可能很高,甚至需要;无论如何,都高于堆栈视图的削波阻力。因此,随着窗口和堆栈视图的缩小,文本字段将压缩直到达到其最小宽度,然后下一个文本字段将压缩,依此类推。当所有文本字段都处于其最小宽度时,堆栈视图将剪切或分离它们(以可见性优先顺序排列),直到它们再次适合为止。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句