忽略隐藏的uilabel的自动布局

时间:2013-03-08 18:27:19

标签: uilabel hidden autolayout

我遇到以下情况:

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

    enter image description here

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

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

    enter image description here

    更新

    我现在在我的代码中添加了两个NSLayoutContstraints,并将它们连接到故事板中创建的约束(看看第三张图片)

    enter image description here

    好的,这里有一个解释:我首先得到两个NSLayoutConstraints:horizo​​ntalSeparatorContstraint将“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的意图或理解是,通过改变优先级,我可以在它们之间切换。但事实似乎并非如此。

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

1 个答案:

答案 0 :(得分:0)

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

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

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

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