我遇到以下情况:
UITableViewCell
,其中包含UILabel
的信息文字。这个UILabel
下面是其他UI元素,例如uilabel
“价格变化”(见第二张图片)和其他元素,如按钮(图中未显示)uilabel
的高度是动态的,因此下方的元素会根据信息文本标签的高度垂直向下移动。 这很好用。如果信息文本增长,则其他元素按照希望向下移动。
现在我的问题:有时需要隐藏信息标签和水平分隔符,因为没有信息文本。不幸的是,uilabel下面的元素仍然被标签的高度向下移动,尽管它被隐藏了。看到我的照片的右侧。元素应向上移动红色垂直条标记的数量。
如果信息标签和“需求”标签被隐藏,我怎么能告诉元素“价格变化”等等它应该向上移动。
更新
我现在在我的代码中添加了两个NSLayoutContstraints,并将它们连接到故事板中创建的约束(看看第三张图片)
好的,这里有一个解释:我首先得到两个NSLayoutConstraints:horizontalSeparatorContstraint将“Price Changes in”标签与第一个水平分隔符UIImageView连接起来。我将值设置为4个单位,这样如果隐藏“需求”和“特殊请求标签”,则此约束应生效,“价格变化”标签向上移动。 第二个约束:requiresLabelContstraint - 这个描述了第二个水平UIImageView和“价格变化”标签之间的空闲空间。差距应为4个单位。如果特殊请求文本可用,则此约束应为“acitve”。
以下是一些新代码:
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的意图或理解是,通过改变优先级,我可以在它们之间切换。但事实似乎并非如此。
那我该如何解决我的问题。
答案 0 :(得分:0)
如果添加IBOutlet
,即使是在Interface Builder中创建的约束,您也可以以编程方式添加和删除约束。
因此,您可以为与信息标签和水平分隔符相关的约束添加IBOutlet
,然后在隐藏它们时,您可以删除这些约束并在再次显示标签时将其放回。
然后,您还会添加一个新约束,只要隐藏信息标签,就会将价格变更标签链接到顶部的水平分隔符,以便正确连接价格变更标签
WWDC 2012中有一段视频解释了如何做这样的事情,我认为这是掌握自动布局的最佳实践