iOS 8 AutoLayout更改视图的位置

时间:2015-02-07 05:09:58

标签: ios objective-c ios8 autolayout

我正在开发一款我最初为iOS 7制作的应用程序,该应用程序运行得很好,但现在转移到iOS 8后,事情再也无法正常工作了。基本上,我有一个按钮的视图。当我点击该按钮时,另一个带有UITextField的UIView会从可见屏幕区域下方的位置“滑动”到屏幕上。当我点击UITextField键入其中键盘出现时,问题就出现了,但是UITextField的视图会回到屏幕上的初始位置。这在iOS 7中没有发生,所以我假设这与iOS 8的autolayout更改有关。有谁知道我可以做些什么来解决这个问题?如果我不需要,我宁愿不关闭autolayout,因为我应用程序的一个很好的部分取决于它。

这是一些代码,向您展示我所指的内容。在我的例子中,“locationField”是被点击的按钮,“locationView”是滑动到屏幕上的UIView:

- (IBAction) locationFieldTapped:(UIButton *)sender {
    [self slideViewUp:_locationView];
}

- (void) slideViewUp:(UIView *)slidingView {
    if (viewIsSlidUp) {
        return;
    }

    CGRect frame = slidingView.frame;
    int availableHeight = self.view.frame.size.height;

    // don't move view up if it's already moved up or in the process of moving up
    if (frame.origin.y < availableHeight) {
        return;
    }

    viewIsSlidUp = YES;

    // move view just off screen for animation start, in case it's not already there

    frame.origin.y = availableHeight;
    slidingView.frame = frame;

    [UIView animateWithDuration:0.5f animations:^{
        CGRect newFrame = frame;
        newFrame.origin.y = availableHeight - CGRectGetHeight(frame);
        slidingView.frame = newFrame;
    }];
}

1 个答案:

答案 0 :(得分:3)

您需要设置您在iOS 8中设置动画的视图的约束,然后自动布局系统处理其余部分。您可以为NSLayoutConstraint创建IBOutlet,只需更改其常量属性即可。然后在动画块中编辑的视图的超级视图上调用layoutIfNeeded方法。