隐藏使用Autolayout查看并重新定位另一个视图

时间:2014-04-01 17:43:28

标签: ios objective-c ios7 autolayout

所以伙计们,

我有一个包含几个信息的个人资料视图。其中一些不必设置,例如传记。因此,根据它的设置,我想隐藏Biografie视图(结帐截图)并重新定位UserData视图和ActivityData视图并更改其超视图的大小以填充Biografie视图所做的空间。

这是我的TableViewHeader的实际结构: enter image description here

我必须关心的另一点是,UILabel必须是mutliline并且符合其内容。

所以我的问题:

  • 如何重新定位UserData& ActivityData视图填充 隐藏的BiografieView制作的空间?
  • 我如何制作Biografie 视图高度是否适合UILabels文本?

请记住我正在使用Autolayout。所以我必须使用约束来修改位置吗?

说实话..基本上它应该像Instagram一样,在添加Biografie时。我希望我说清楚我想要的东西..

修改1

我已经尝试过你的建议Damien,但一切都没有改变:

    NSLog(@"Height %f, Width %f", self.labelBiografie.frame.size.height, self.labelBiografie.frame.size.width);

if ([self.profileUser objectForKey:kGSUserBiografieKey]) {
    self.labelBiografie.text = [self.profileUser objectForKey:kGSUserBiografieKey];
    [self.labelBiografie sizeToFit];
}else{
    [self.labelBiografie setHidden:YES];
    [self.countContainer setConstraintConstant:-self.labelBiografie.frame.size.height forAttribute:NSLayoutAttributeCenterY];
    [self.tableHeaderViewChildVIew setConstraintConstant:-self.labelBiografie.frame.size.height forAttribute:NSLayoutAttributeHeight];
    self.tableView.tableHeaderView = self.tableHeaderViewChildVIew;
}

编辑2:

使用此项目(UIView-UpdateAutoLayoutConstraints )我在方法上遇到以下错误:

第56行:[self hideView:hidden byAttribute:NSLayoutAttributeHeight];

第85行:[self setConstraintConstant:0 forAttribute:attribute];

第23行:

[self.superview addConstraint: [NSLayoutConstraint constraintWithItem:self attribute:attribute relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0f constant:constant]];

ERROR:

    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 
(
    "<NSLayoutConstraint:0x8c1b8e0 V:|-(0)-[UIButton:0x8c6fb40]   (Names: '|':UIView:0x8c6f630 )>",
    "<NSLayoutConstraint:0x8c19dc0 V:[UIButton:0x8c6fb40(100)]>",
    "<NSLayoutConstraint:0x8c1d740 V:[UIButton:0x8c6fb40]-(NSSpace(8))-[UILabel:0x8c70900]>",
    "<NSLayoutConstraint:0x8c20df0 V:[UILabel:0x8c70900]-(NSSpace(8))-[UIView:0x8c16a00]>",
    "<NSLayoutConstraint:0x8c20fa0 V:[UIView:0x8c16a00(40)]>",
    "<NSLayoutConstraint:0x8c23790 V:[UIView:0x8c16a00]-(0)-|   (Names: '|':UIView:0x8c6f630 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x8c78e60 h=--& v=--& V:[UIView:0x8c6f630(217)]>",
    "<NSLayoutConstraint:0x8c5d000 V:[UILabel:0x8c70900(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x8c20df0 V:[UILabel:0x8c70900]-(NSSpace(8))-[UIView:0x8c16a00]>

Break on objc_exception_throw to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

这个错误出现在开箱即用的Demo-Project上,在我的项目上,当我隐藏视图时它也会被返回..

2 个答案:

答案 0 :(得分:1)

我建立了一个类别来回答我已经遇到的这个问题: Hide autolayout UIView : How to get existing NSLayoutConstraint to update this one

修改

如果您使用自动布局,请不要再使用 view.frame ,也不要忘记设置所有自动布局视图:

myView.translatesAutoresizingMaskIntoConstraints = NO;

使用此类别https://github.com/damienromito/UIView-UpdateAutoLayoutConstraints

if(!user.biografie && user.biografie.lenght == 0)
{
     [biografieLabel setConstraintConstant:0 forAttribute:NSLayoutAttributeHeight];
}else
{
     biografieLabel.text = user.biografie;
}

答案 1 :(得分:1)

对于你的问题二,第一个解决方案是在uilabel和容器的高度之间有一个高度约束(BiografieView)。

NSLayoutConstraint *constraint = [NSLayoutConstraint
                                  constraintWithItem:biografieView /// change here
                                  attribute:NSLayoutAttributeHeight
                                  relatedBy:NSLayoutRelationEqual
                                  toItem:biografieLabel  /// change here
                                  attribute:NSLayoutAttributeHeight
                                  multiplier:1
                                  constant:0];
[view addConstraint:constraint];

不要忘记设置uilabel.numberOfLine = 0, 这个的高度将自动更新

但是,但是......但(更适合您的情况的解决方案) 如果您的biografie视图中只有一个uilabel,请移除此容器。 uilabel也是一个uiview,你不会再遇到这个问题了。