所以伙计们,
我有一个包含几个信息的个人资料视图。其中一些不必设置,例如传记。因此,根据它的设置,我想隐藏Biografie视图(结帐截图)并重新定位UserData视图和ActivityData视图并更改其超视图的大小以填充Biografie视图所做的空间。
这是我的TableViewHeader的实际结构:
我必须关心的另一点是,UILabel必须是mutliline并且符合其内容。
所以我的问题:
请记住我正在使用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上,在我的项目上,当我隐藏视图时它也会被返回..
答案 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,你不会再遇到这个问题了。