2013-03-08 72 views
0

我有以下情况:忽略自动版式隐藏的UILabel

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

这工作正常。如果信息文本增长,其他元素按照希望向下移动。

enter image description here

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

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

enter image description here

更新:

我现在加了两个NSLayoutContstraints我的代码,并在故事板它们连接到创建的约束(看一看第三画面)

enter image description here

好的,这里有一个解释:我有两个NSLayoutConstraints 1rst:horizo​​ntalSeparatorContstraint将“Price Changes in”标签与第一个水平分隔符UIImage视图。我将该值设置为4个单位,以便如果隐藏“需求”和“特殊请求标签”,则此约束应该生效,并且“价格变化在”标签向上移动。 第二个约束:requiresLabelContstraint - 这个描述了第二个水平UIImageView和“Price changes in”标签之间的空间。差距应该是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的意图或理解是,通过改变优先级,我可以在它们之间切换。但这似乎并非如此。

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

回答

0

如果添加IBOutlet,即使在Interface Builder中创建的约束也能以编程方式添加和删除约束。

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

你会再补充一点,在每当信息标签隐藏起来,价格变化标签将被正确连接

有一个视频在顶部的价格变动标签链接到水平分离装置一个新的约束WWDC 2012解释如何做这样的事情,我认为这是掌握自动布局的最佳实践

+0

谢谢你的答案。我更新了我的问题。 – toom 2013-03-15 18:14:20