我有一个视图,我试图在键盘向上滑动时设置高度变化的动画(代码如下所示)。我称之为框架改变的视图是完美的动画;但是,该视图包含一个子视图,该子视图又包含一个文本字段(导致键盘弹出),这些子视图只是跳转到新的位置而不是动画。我在子视图上设置了自动布局约束,将其限制在超视图的左侧,底部和右侧,并保持恒定的高度。
此处的示例视频:http://youtu.be/EmcZ-cXeTbM
#import "ViewController.h"
@interface ViewController ()
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(slideViewForKeyboard:) name:UIKeyboardWillShowNotification object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(slideViewForKeyboard:) name:UIKeyboardWillHideNotification object:nil];
}
- (void)slideViewForKeyboard:(NSNotification *)note {
NSDictionary* userInfo = [note userInfo];
// Get animation info from userInfo
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardEndFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardEndFrame];
CGRect newFrame = CGRectMake(self.view.frame.origin.x,
self.view.frame.origin.y,
self.view.frame.size.width,
keyboardEndFrame.origin.y);
[UIView animateWithDuration:0 delay:0 options:(animationCurve << 16) animations:^{
[self.view setFrame:newFrame];
}completion:^(BOOL completed){}];
}
- (IBAction)endEditingOnTap:(UITapGestureRecognizer *)sender {
[self.view endEditing:YES];
}
@end
答案 0 :(得分:9)
您应该使用animationDuration
作为动画块的持续时间。
除此之外,还有另一个问题。现在,您在动画块中设置视图的框架,因此更改是动画的。但是系统会在运行循环的布局阶段之后,在动画块之外放置子视图。这意味着子视图不会被动画化为新的帧。
您可以通过向动画块内的视图发送layoutIfNeeded
来解决此问题:
[UIView animateWithDuration:animationDuration delay:0 options:(animationCurve << 16) animations:^{
self.view.frame = newFrame;
[self.view layoutIfNeeded];
} completion:^(BOOL completed){}];
但你可能会遇到另一个问题。您正在直接设置视图的框架,但您正在使用自动布局。在某些时候,自动布局可能会根据您的约束设置帧。您需要修改视图上的约束以控制其新帧,而不是直接设置框架。
答案 1 :(得分:0)
设置动画持续时间。
[UIView animateWithDuration:0.3 delay:0 options:(animationCurve << 16) animations:^{
[self.view setFrame:newFrame];
}completion:^(BOOL completed){}];
答案 2 :(得分:0)
你将0传递给-[UIView animateWithDuration:delay:options:animations:completion]
。这不会产生动画,因为它在0秒内从帧0到帧n-1(其中n是它将生成的帧数),也就是瞬间。尝试传递animationDuration
作为参数的持续时间,使其以与键盘相同的速度进行动画