Objective c 我缺少什么可以阻止我使用自动布局创建一个类似NSStackView的容器?

Objective c 我缺少什么可以阻止我使用自动布局创建一个类似NSStackView的容器?,objective-c,macos,cocoa,autolayout,nsview,Objective C,Macos,Cocoa,Autolayout,Nsview,我正在尝试为OS X实现一个自动布局的容器视图,该视图的操作与NSStackView类似,但有一些差异NSStackView无法处理(无论如何,我需要10.7支持)。我的规则是: 子视图水平或垂直排列 在主方向上,默认情况下,子视图采用其固有大小 如果子视图标记为“拉伸”,则在布局所有非拉伸子视图后,它将占用剩余的任何空间。多个拉伸子视图获得剩余空间的相等分布 如果没有子视图是可拉伸的,则容器可以沿主方向增长,在最后一个子视图之后显示空空间。以相同的方向嵌套两个这样的堆栈会优先于外部堆栈 沿次

我正在尝试为OS X实现一个自动布局的容器视图,该视图的操作与NSStackView类似,但有一些差异NSStackView无法处理(无论如何,我需要10.7支持)。我的规则是:

  • 子视图水平或垂直排列
  • 在主方向上,默认情况下,子视图采用其固有大小
  • 如果子视图标记为“拉伸”,则在布局所有非拉伸子视图后,它将占用剩余的任何空间。多个拉伸子视图获得剩余空间的相等分布
  • 如果没有子视图是可拉伸的,则容器可以沿主方向增长,在最后一个子视图之后显示空空间。以相同的方向嵌套两个这样的堆栈会优先于外部堆栈
  • 沿次方向,子视图夹持到容器视图的边缘并自由增长
我认为这可以用一种简单的方法来实现,先在主方向上一个接一个地连接视图,然后使用
|[view]|
视觉格式在次方向上连接视图。缺少弹性视图时,将使用内部内容大小为0x0的NSView作为最后一个视图来处理

这基本上奏效了。不幸的是,表单的水平方向堆栈的嵌套树(出于解释目的使用HTML表示)产生了歧义

.box{
显示:内联块;
边框:1px纯黑;
填充:0.5em 0.5em 0.5em 0.5em;
}
.最外面的盒子{
显示:内联块;
边框:1px纯黑;
填充:0.5em 0.5em 0.5em 0.5em;
宽度:100%;
}

我自己解决了这个问题

主要的变化是,在它不是通过对self的约束,而是通过它的superview来完成之后,不再拥有额外的空间。superview询问self是否应该占用额外的空间,如果是,它将分配额外的空间(使用>=约束来代替==约束来分配superview边)

多种其他次要修复修复了边缘情况。尤其是在我工作的任何地方

relation = NSLayoutRelationSomething;
if (condition)
    relation = NSLayoutRelationSomethingElse;
constraint = [NSLayoutConstraint constraintWithArg:arg arg:arg
    relation:relation
    ...]
我改为使用两个约束,根据条件设置它们的优先级这可能是一种自动布局的最佳实践,因为它工作得非常好…

无论如何谢谢你