1

我试图弄清楚如何在不失去约束的情况下调整 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 重叠。经过一番研究,似乎如果我更换框架,所有约束也都消失了。我尝试复制约束,但当然指针仍然指向旧框架,所以这根本没有帮助。

有没有解决非常动态布局的页面的好方法?我正在尝试至少使用界面构建器而不是编写所有代码。

已编辑

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

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

已编辑 2

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

4

1 回答 1

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];
}];

如果您在 Interface Builder 中定义了 UI,请选择按钮并检查按钮的顶部约束,并确保它位于标签上,而不是超级视图:

顶部约束

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

于 2013-09-08T20:26:01.213 回答