这是一个奇怪的问题。我有一个 iPhone 视图控制器,用于创建一个带有一些文本字段的新用户,这些文本字段在显示时需要动画以避免键盘,即视图上下动画以保持键盘顶部和键盘下边缘之间的最小间隙文本字段。当它从登录现有用户屏幕(故事板中的初始视图控制器)以模态方式呈现时,效果很好。
然后我决定稍微改变一下应用程序,以便登录/创建用户视图属于同一个视图控制器。他们像这样过渡:
if(accountCreateView == nil) {
UINib *nib = [UINib nibWithNibName:@"NewAccountView" bundle:nil];
NSArray *nibViews = [nib instantiateWithOwner:self options:nil];
accountCreateView = [nibViews objectAtIndex:0];
}
[UIView transitionFromView:(displayingLoginView ? loginView : accountCreateView)
toView:(displayingLoginView ? accountCreateView : loginView)
duration:0.6
options:(displayingLoginView ?
UIViewAnimationOptionTransitionFlipFromRight :
UIViewAnimationOptionTransitionFlipFromLeft)
completion:^(BOOL finished) {
if (finished) {
displayingLoginView = !displayingLoginView;
}
}
];
这也很好。但是,执行视图动画的代码却没有。当文本字段变为活动状态时,将调用检查文本字段与键盘的接近程度的代码,但在执行动画块时没有任何反应。
所以我检查了:
if([UIView areAnimationsEnabled])
NSLog(@"Animations are enabled");
else
NSLog(@"Animations are disabled");
动画肯定是启用的。
所以我把它移回到 viewDidLoad,尝试一个简单的动画来看看什么是有效的,然后再做其他事情:
CGRect viewFrame = loginNameTextField.frame;
viewFrame.origin.y = 400.f;
[UIView animateWithDuration:1.f
delay:0.f
options:UIViewAnimationOptionCurveEaseInOut
animations:^ {
loginNameTextField.frame = viewFrame;
}
completion:NULL];
这很好用!文本字段在窗口下方缓慢移动。
这什么也没做,这是令人困惑的部分:
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
[UIView animateWithDuration:1.f
delay:0.f
options:UIViewAnimationOptionCurveEaseInOut
animations:^ {
self.view.frame = viewFrame;
}
completion:NULL];
从 self.view.frame 设置的 viewFrame 的原点为 0,20,大小为 320,460,如预期的那样。
我尝试直接设置框架属性:
CGRect viewFrame = self.view.frame;
viewFrame.origin.y = 400.f;
self.view.frame = viewFrame;
看起来我可以更改 self.view 的子视图框架,但不能更改 self.view 的子视图框架。解决方法可能是将初始视图控制器保留为情节提要中的空白视图,并为登录视图和创建用户视图创建 xibs 并将它们加载到 viewDidLoad - 但为什么呢?
编辑:是的,将视图控制器的情节提要版本切换到普通的空视图并将包含来自 xib 的实际 UI 的视图添加为子视图确实可以使动画再次起作用。仍然不知道为什么。