iOS 8 AutoLayout 改变视图的位置
iOS 8 AutoLayout changing the position of a view
我正在开发我最初为 iOS 7 制作的应用程序,该应用程序运行良好,但现在在移动到 iOS 8 后,一切都无法正常工作了。基本上,我有一个带有按钮的视图。当我点击该按钮时,另一个带有 UITextField "slides" 的 UIView 从可见屏幕区域下方的位置向上显示到屏幕上。当我点击 UITextField 向其中输入内容时,问题就来了,键盘出现了,但是带有 UITextField 的视图又回到了屏幕外的初始位置。这在 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 中设置动画视图的约束,然后自动布局系统会处理其余部分。您可以为 NSLayoutConstraint 创建一个 IBOutlet 并简单地更改其常量 属性。然后在动画块中的已编辑视图的超级视图上调用 layoutIfNeeded 方法。
我正在开发我最初为 iOS 7 制作的应用程序,该应用程序运行良好,但现在在移动到 iOS 8 后,一切都无法正常工作了。基本上,我有一个带有按钮的视图。当我点击该按钮时,另一个带有 UITextField "slides" 的 UIView 从可见屏幕区域下方的位置向上显示到屏幕上。当我点击 UITextField 向其中输入内容时,问题就来了,键盘出现了,但是带有 UITextField 的视图又回到了屏幕外的初始位置。这在 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 中设置动画视图的约束,然后自动布局系统会处理其余部分。您可以为 NSLayoutConstraint 创建一个 IBOutlet 并简单地更改其常量 属性。然后在动画块中的已编辑视图的超级视图上调用 layoutIfNeeded 方法。