iOS 8 AutoLayout 改变 View 的位置

标签 ios objective-c ios8 autolayout

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

这是一些代码,可以向您展示我所指的内容。在我的示例中,“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;
    }];
}

最佳答案

您需要在 iOS 8 中设置动画 View 的约束,然后自动布局系统处理其余部分。您可以为 NSLayoutConstraint 创建一个 IBOutlet 并简单地更改其常量属性。然后在动画 block 中对已编辑 View 的 super View 调用 layoutIfNeeded 方法。

关于iOS 8 AutoLayout 改变 View 的位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28378813/

相关文章:

ios - Swift 中的 Int 与 Integer

iOS sqlite 无法提交,没有事务处于事件状态

ios - 从 google places api ios 访问结果以自动完成

ios - 从父级获取子类

ios - 如何检索 map 标注坐标?

ios - 如何调查 ios 中的内存泄漏?

ios - 带有部分重复单元格的 UITableView

iphone - 这个声明有漏洞吗?

ios - 使用 iOS 8 可操作通知启动应用程序

objective-c - 在自定义键盘扩展中添加贴纸