0

我有以下情况:

  1. 我正在使用自动布局
  2. 我有一个UITableViewCell包含UILabel信息文本的。下面UILabel是其他 UI 元素,如uilabel“价格变化”(见第二张图片)和其他元素,如按钮(图中未显示)
  3. 由于信息文本uilabel的高度是动态的,因此下方的元素会根据信息文本标签的高度垂直向下移动。
  4. 在第一张图片中,您可以看到一条水平线。如果信息标签的高度增加,这条水平线会垂直向下移动。“价格变化”标签根据这条水平线的位置垂直对齐。

这工作正常。如果信息文本增长,则其他元素会根据需要向下移动。

在此处输入图像描述

现在我的问题:有时信息标签和水平分隔符需要隐藏,因为没有信息文本。不幸的是,uilabel 下的元素仍然被标签的高度向下移动,尽管它是隐藏的。请看我图片的右侧。元素应向上移动红色竖线标记的量。

如果信息标签和“需求”标签被隐藏,我如何告诉元素“价格变化”等应该向上移动。

在此处输入图像描述

更新:

我现在在我的代码中添加了两个 NSLayoutContstraints 并将它们连接到情节提要中创建的约束(请看第三张图片)

在此处输入图像描述

好的,这里有一个解释:我得到了两个 NSLayoutConstraints 第一个:horizo​​ntalSeparatorConstraint 将“Price Changes in”标签与第一个水平分隔符 UIImageView 连接起来。我将该值设置为 4 个单位,这样如果隐藏了“需求”和“特殊请求标签”,则此约束应该生效,并且“价格变化”标签会向上移动。第二个约束: requirementsLabelConststraint - 这个约束描述了第二个水平 UIImageView 和“价格变化”标签之间的不理想空间。间隙应为 4 个单位。如果特殊请求文本可用,则此约束应该是“活跃的”。

这是一些新代码:

if( tour.specialRequests.length > 0 ) {
    [demandsLabelContstraint setPriority:UILayoutPriorityDefaultHigh];
    [horizontalSeparatorContstraint setPriority:UILayoutPriorityDefaultLow];

    self.demandsLeftLabel.text = NSLocalizedString(@"GenericTour_Demands", @"");
    self.demandsRightLabel.text = tour.specialRequests;

    demandsLeftLabel.hidden = NO;
    demandsRightLabel.hidden = NO;
    horizontalSeparator.hidden = NO;
} else {
    [demandsLabelContstraint setPriority:UILayoutPriorityDefaultLow];
    [horizontalSeparatorContstraint setPriority:UILayoutPriorityDefaultHigh];

    horizontalSeparator.hidden = YES;
    demandsRightLabel.hidden = YES;
    demandsLeftLabel.hidden = YES;
}

从代码中可以看出:我的想法是针对每种情况切换优先级。如果特殊请求文本可用,则通过设置优先级触发相应的 NSLayoutContraints。

我对 Autolayout 的意图或理解是,通过更改优先级,我可以在它们之间切换。但情况似乎并非如此。

那么我应该如何解决我的问题。

4

1 回答 1

0

如果您添加一个IBOutlet.

因此,您可以IBOutlet为与信息标签和水平分隔符相关的约束添加一个,然后当它们被隐藏时,您可以删除这些约束并在标签再次显示时将它们放回去。

然后,您还可以添加一个新约束,将价格更改标签链接到顶部的水平分隔符,只要信息标签被隐藏,以便价格更改标签将正确连接

WWDC 2012 中有一个视频解释了如何做这样的事情,我认为这是掌握自动布局的最佳实践

于 2013-03-09T00:53:30.807 回答