在不失去约束的情况下调整UITextView的大小

时间:2013-09-08 18:06:01

标签: ios uiview uitextview constraints autolayout

我正试图弄清楚如何在不丢失约束的情况下调整UITextView(以及其他所有内容)的大小。基本上,我正在尝试布局一个页面,其中大多数组件可以具有可变大小(如描述)。我尝试使用一个简单的用例,其中有一个UITextView和一个UIButton。我想确保按钮的位置相对于UITextView的底部。

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    CGRect frame = self.textView.frame;
    int height = self.textView.contentSize.height;
    frame.size.height = height;
    self.textView.frame = frame;
}

我最终得到的是UITextView与UIButton重叠。经过一些研究后,似乎如果我更换框架,所有约束也都消失了。我尝试复制约束,但当然指针仍然指向旧框架,所以根本没有帮助。

有没有一种很好的方法来解决一个非常动态布局的页面?我试图至少使用界面构建器而不是编码所有内容。

EDITED

我尝试按照建议更新约束,但实际上并没有调整UITextView的大小。我做错了吗?当我再次获得常数时,它会更新,但高度不会在视觉上改变。我通过为约束添加IBOutlet来简化我的代码。然而,仍然没有运气。

int height = self.textView.contentSize.height;
self.textViewHeightConstraint.constant = height;

已编辑2

我现在明白了。我对底部有一个额外的约束,这阻止我实际调整UITextView的大小。

1 个答案:

答案 0 :(得分:1)

问题在于您如何定义按钮的顶部约束。如果是标签,当您调整标签的高度约束时,按钮将移动。例如,如果以编程方式执行此操作:

UILabel *label = [[UILabel alloc] init];
label.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:label];
label.text = @"Hello world";

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Submit" forState:UIControlStateNormal];
button.translatesAutoresizingMaskIntoConstraints = NO;
[self.view addSubview:button];

NSDictionary *views = NSDictionaryOfVariableBindings(label, button);
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[label]" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-[button]" options:0 metrics:nil views:views]];
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-[label]-[button]" options:0 metrics:nil views:views]];
NSLayoutConstraint *heightConstraint = [NSLayoutConstraint constraintWithItem:label attribute:NSLayoutAttributeHeight relatedBy:NSLayoutRelationEqual toItem:nil attribute:NSLayoutAttributeNotAnAttribute multiplier:1.0 constant:20];
[label addConstraint:heightConstraint];

然后,如果更改标签的高度约束,按钮将移动:

heightConstraint.constant = 100;
[UIView animateWithDuration:1.0 animations:^{
    [self.view layoutIfNeeded];
}];

如果您已在界面生成器中定义了UI,请选择按钮并检查按钮的顶部约束,并确保它是标签,而不是超级视图:

top constraint

但是,再次,如果按钮的顶部约束是标签,当标签的高度约束发生变化时,按钮将移动。