更改UIView框架时移动元素

时间:2013-04-15 21:31:23

标签: objective-c ios6 autolayout

我的UITextView很少。每个TextView都会在焦点上改变它的大小 - 它会像这样增加大约50px:

[UITextView animateWithDuration:.1f animations:^{
    CGRect new_frame = textView.frame;
    new_frame.size.height += height;
    textView.frame = new_frame;
}];

现在我的问题是我需要在聚焦的50px下移动TextViews(显然还有动画)。我想知道如何以最简单的方式做到这一点。我的应用只是iOS6,所以我可以使用自动布局。我尝试过但失败了。我尝试过使用支柱和弹簧 - 也失败了。

想到的唯一解决方案就是用动画移动50 px的每个元素。但这对我来说听起来很便宜。有什么想法怎么做?是否可以使用自动布局?

修改

以下是我一直在尝试的布局:

Vertical layout

enter image description here

单击第一个TextView后,它在模拟器中的外观如下:

enter image description here

因此,您可以看到它覆盖下一个视图并且不保留约束。

3 个答案:

答案 0 :(得分:5)

不要将帧与自动布局结合使用,这会给你带来不可预测的结果。

将约束从第二个UITextView的顶部移除到其超级视图的顶部。

然后为UITextView的高度约束创建一个出口。

使用以下代码调整UITextView

的高度
- (void)textViewDidBeginEditing:(UITextView *)textView
{
    [UITextView animateWithDuration:.1f animations:^{
        self.textViewHeightConstraint.constant +=50;
        [self.view layoutIfNeeded];
    }];
}

-(void)textViewDidEndEditing:(UITextView *)textView
{
    [UITextView animateWithDuration:.1f animations:^{
        self.textViewHeightConstraint.constant -=50;
        [self.view layoutIfNeeded];
    }];
}

答案 1 :(得分:1)

使用自动布局非常容易实现这一点,你需要在每个文本视图上设置一个垂直空间约束,告诉它在上面的文本视图之间留下x像素。

这是一个很好的自动布局教程,应该有助于解释一些概念,如果你没有使用autolayout之前有点棘手。

Beginning Auto Layout in iOS 6

答案 2 :(得分:1)

听起来像Apple提供表格视图解决方案的问题。

您可以在表格视图中增加一行的高度,并自动按下以下行。制作动画也很直截了当。