我正在尝试弄清楚如何在不丢失约束的情况下调整 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;
}
我最终得到的是与 UIButton 重叠的 UITextView。做了一些研究后,似乎如果我更换框架,所有约束也都消失了。我尝试复制约束,但当然指针仍然指向旧框架,所以这根本没有帮助。
是否有解决动态布局页面的好方法?我正在尝试至少使用界面构建器而不是编写所有代码。
已编辑
我尝试按照建议更新约束,但实际上并没有调整 UITextView 的大小。我做错了吗?当我再次获得常量时,它会更新,但高度在视觉上没有改变。我确实通过为约束添加一个 IBOutlet 来简化我的代码。然而仍然没有运气。
int height = self.textView.contentSize.height;
self.textViewHeightConstraint.constant = height;
已编辑 2
我现在明白了。我对底部有一个额外的约束,这阻止了我实际调整 UITextView 的大小。
最佳答案
问题在于您如何定义按钮的顶部约束。如果是标签,当你调整标签的高度约束时,按钮会移动。例如,如果以编程方式进行:
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];
}];
如果您已经在 Interface Builder 中定义了您的 UI,请选择按钮并检查按钮的顶部约束并确保它位于标签上,而不是父 View :
但是,同样,如果按钮的顶部约束是标签,当标签的高度约束发生变化时,按钮将移动。
关于ios - 在不丢失约束的情况下调整 UITextView 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686967/