ios - 在不丢失约束的情况下调整 UITextView 的大小

标签 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;
}

我最终得到的是与 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 :

top constraint

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

关于ios - 在不丢失约束的情况下调整 UITextView 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18686967/

相关文章:

iOS - Interface Builder - 在同一个 xib 中绑定(bind)多个 View

ios - Xcode 与 iPhone 失去连接

ios - 如何在单击时从一个 ViewController(包含自定义 UIView)移动到另一个 ViewController(包含 UITableView)?

iphone - 移动包含 UIButtons 的 UIView 会使这些按钮停止响应点击

ios - 将委托(delegate)消息从 UIPopover 发送到主 UIViewController

iOS:我有一个要求 textview 成为第一响应者

ios - NSUserDafaults 空值?

objective-c - 以顶部中心为 anchor 缩放 UIView?

ios - UITextVIew secureTextEntry 不工作

iOS - 将发件人(按钮)名称传递给 addSubview