OS X Cocoa Auto Layout隐藏元素

Jee*_*ena 29 macos cocoa osx-lion

我试图在Lion中使用新的Auto Layout,因为它看起来很不错.但我找不到关于如何做事的好信息.例如:

我有两个标签:

+----------------+
| +------------+ |
| + label 1    | |
| +------------+ |
|                |
| +------------+ |
| | label 2    | |
| +------------+ |
+----------------+
Run Code Online (Sandbox Code Playgroud)

但是第一个标签并不总是填充内容,有时候根本没有内容.我想要做的是自动显示标签2的标签2,当标签1有内容时.

+----------------+
| +------------+ |
| + label 2    | |
| +------------+ |
|                |
|                |
|                |
|                |
+----------------+
Run Code Online (Sandbox Code Playgroud)

我必须添加什么约束才能自动使用autolayout?我知道我可以编写所有代码,但我有大约30个这样的标签和图像以及不同风格和形状的按钮都是可选的,我不想添加代码行的代码,因为它可以自动工作也很好.

如果它不起作用,那么我将使用WebView并使用HTML和CSS.

Dav*_*eck 24

这可以通过自动布局实现,但不能很好地扩展.

所以,举个例子,假设你有标签A,标签B(或按钮或其他任何东西).首先在A的超视图中添加一个顶部约束.然后在A和B之间建立一个垂直间距约束.到目前为止这是正常的.如果此时要删除A,则B将具有不明确的布局.如果你要隐藏它,它仍会占据它的空间,包括标签之间的空间.

接下来,您需要将另一个约束从B添加到超级视图的顶部.将此优先级更改为低于其他优先级(比如900),然后将其设置为标准(或其他较小值).现在,当A从它的超视图中移除时,较低优先级的约束将启动并将B拉向顶部.约束看起来像这样:

Interface Builder截图

当您尝试使用一长串标签执行此操作时会出现此问题.


Cam*_*mer 10

折叠UILabel子类

一个简单的解决方案是将UILabel子类化并更改内在内容大小.

@implementation WBSCollapsingLabel

- (CGSize)intrinsicContentSize
{
    if (self.isHidden) {
        return CGSizeMake(UIViewNoIntrinsicMetric, 0.0f);
    } else {
        return [super intrinsicContentSize];
    }
}

- (void)setHidden:(BOOL)hidden
{
    [super setHidden:hidden];

    [self updateConstraintsIfNeeded];
    [self layoutIfNeeded];
}

@end
Run Code Online (Sandbox Code Playgroud)


Mar*_*ick 2

我认为你不能那样做。如果您使标签 2 的布局基于距标签 1 的距离约束,即使您使标签 1 在没有内容时自动折叠到零高度,标签 2 仍将是向下的距离,即:

+----------------+
| +------------+ |
| + label 1    | |
| +------------+ |
|        ^       |
|        ^       !
| +------------+ |
| | label 2    | |
| +------------+ |
+----------------+
Run Code Online (Sandbox Code Playgroud)

其中 ^ 是自动布局距离约束 - 如果 Label 1 知道当字符串为空时如何变为零高度,您仍然会得到:

+----------------+
| +------------+ |
|        ^       |
|        ^       !
| +------------+ |
| | label 2    | |
| +------------+ |
+----------------+
Run Code Online (Sandbox Code Playgroud)

也许可以通过手动创建 NSLayoutConstraint 来实现。您可以将第二个属性设置为标签 1 的高度,将常数设置为零,然后根据非零标签高度的倍数仔细算出使距离达到您想要的距离的乘数。

但是完成所有这些之后,您现在已经编写了一个自动调整大小的 NSLabel 子类,手动创建了一个约束对象而不是通过视觉语言,并且使 NSLayoutConstraint 超出了其意愿。

我认为如果标签 1 的字符串为空,您最好只更改标签 2 的框架!