NSStackView的视图间距不正确

Georgemp

我一直在玩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属性的值),并且重力区域之间的距离随着堆栈视图沿其布局方向轴的增大和缩小而增大和缩小。

但是,这似乎没有发生。重力区域(前导区域)内的视图之间的间距不是恒定的,并且似乎没有将重力区域之间的距离增大/缩小,而是将其设置为间隔距离。

我想要的是在页脚的左侧(以默认距离隔开)出现一个,两个,三个,并在页脚的右侧出现四个,五个。我可以尝试通过使用两个不同的堆栈视图(一个用于前导区域,另一个用于尾随区域)来解决这个问题,但是,我认为使用单个堆栈视图和重力区域应该可以做到这一点。希望对此有一些指导。谢谢

肯·托马斯(Ken Thomases)

的docsspacing属性NSStackView显示,重力区域之间的间隔设置为该spacing值(默认为8个点),并且堆栈视图的配置在该方向上具有优先级(默认为NSLayoutPriorityDefaultLow)。

如果包含文本字段优先级的内容低于该优先级,则自动布局系统将更喜欢拉伸其中一个而不是重力区域之间的间距。这就是为什么您的问题中所示的文本字段之一被拉伸的原因。(如果文本字段具有相同的内容优先级,则拉伸哪个文本字段是任意的,并且可以随时更改。)

如果文本字段的内容包含优先级等于堆栈视图的包含优先级,那么扩展的内容是任意的。它可以是文本字段之一,也可以是重力间区域间距。

正如您在答案中所指出的,您想使文本字段具有更高的内容优先级。不需要这样NSLayoutPriorityDragThatCanResizeWindow它可以高于堆栈视图的优先级。

正如您在回答中报告的那样,这与限制窗口缩小无关。

如果要让堆栈视图缩小到比其子视图指示的大小及其之间的间距窄的位置,则有两个选择。首先,你可以将其裁剪性优先级设置为东西小于NSLayoutPriorityWindowSizeStayPut使用-setClippingResistancePriority:forOrientation:这将导致堆栈视图允许剪切或分离视图。发生哪种情况取决于设置的视图的可见性优先级setVisibilityPriority:forView:默认情况下,所有视图的可见性优先级为NSStackViewVisibilityPriorityMustHold,这意味着它们不会分离,但会被裁剪。

因此,如果要分离视图,则应更改其可见性优先级。您应该对优先级进行排序,以指示要相对于其他视图(较高)首先分离的视图(较低的可见性优先级)。

另一种方法是将子视图的压缩阻力优先级设置为低于NSLayoutPriorityWindowSizeStayPut这意味着自动布局系统将压缩文本字段,通常将其用省略号(“…”)截断。您可能希望对文本字段的抗压缩优先级进行排序,以确定它们的压缩顺序,否则将是任意的(甚至可能会随时变化)。您可能还希望在文本字段上设置最小宽度限制,因为在某些时候,使文本字段可见但没有空间显示任何有意义的内容似乎很糟糕。

您可以通过使文本字段的压缩阻力低于堆栈视图的剪切阻力来结合这两种方法。文本字段的最小宽度限制可能很高,甚至需要;无论如何,都高于堆栈视图的削波阻力。因此,随着窗口和堆栈视图的缩小,文本字段将压缩直到达到其最小宽度,然后下一个文本字段将压缩,依此类推。当所有文本字段都处于其最小宽度时,堆栈视图将剪切或分离它们(以可见性优先顺序排列),直到它们再次适合为止。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

CSS网格间距不正确

来自分类Dev

使用BorderLayout的JPanels的间距不正确

来自分类Dev

字母间距仅对一个单词不正确

来自分类Dev

UICollectionViewCell子视图大小不正确

来自分类Dev

CALayer在视图中的位置不正确

来自分类Dev

渐变弧视图显示不正确

来自分类Dev

视图在iOS中显示不正确

来自分类Dev

设置了约束,但视图放置不正确

来自分类Dev

表视图显示不正确

来自分类Dev

列表视图行为不正确

来自分类Dev

UIScrollView 显示子视图不正确

来自分类Dev

<p> field <p>带有p {字母间距:6px;}的间距不正确

来自分类Dev

滚动视图中加载的视图大小不正确

来自分类Dev

不正确的尺寸不正确

来自分类Dev

创建UICollectionViewCell时子视图框架不正确

来自分类Dev

从UIView创建的IMessage MSSticker视图大小不正确

来自分类Dev

为什么子表视图的大小不正确?

来自分类Dev

为什么SwiftUI呈现的视图显示不正确?

来自分类Dev

集合视图中单元格的宽度不正确

来自分类Dev

SQL视图对NULL值的排序顺序不正确

来自分类Dev

视图显示不正确。拉拉韦尔

来自分类Dev

计时器在列表视图中不正确

来自分类Dev

自动布局-视图控制器框架不正确

来自分类Dev

以编程方式创建的显示不正确的视图(android)

来自分类Dev

使用堆栈视图时帧值不正确

来自分类Dev

android自定义组视图布局不正确

来自分类Dev

显示键盘后,视图定位不正确

来自分类Dev

XCode场景视图加载模型不正确

来自分类Dev

管理视图中的 Django ImageField url 不正确