iOS 7 – 键盘animation
我试图了解iPhone 5模拟器上的iOS 7.0中的新键盘animation。 我想调整我的UITableView
当键盘出现,但我不能得到正确的animation细节。
当键盘出现或消失时,我使用NSNotification
对象中的信息。
这是我的日志:
Move keyboard from {{0, 920}, {320, 216}} to {{0, 352}, {320, 216}} with duration: 0.400000 and animation curve: 7 UIViewAnimationCurveEaseInOut = 0 UIViewAnimationCurveEaseIn = 1 UIViewAnimationCurveEaseOut = 2 UIViewAnimationCurveLinear = 3
animation曲线是一个未知的值,我该怎么做?
在iOS 7中,键盘使用新的未公开的animation曲线。 虽然有些人已经注意到为animation选项使用未公开的值,我更喜欢使用以下内容:
[UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; [UIView setAnimationBeginsFromCurrentState:YES]; // work [UIView commitAnimations];
虽然基于块的animation是build议,但从键盘通知返回的animation曲线是UIViewAnimationCurve
,而您需要传递给基于块的animation的选项是UIViewAnimationOptions
。 使用传统的UIViewanimation方法可以让你直接input数值。 最重要的是,这将使用新的未公开的animation曲线(整数值为7),并使animation与键盘匹配 。 而且,它在iOS 6和7上也可以正常工作。
现在我find了解决scheme。 animation从点{0, 920}
到{0, 352}
。 问题是UITableView
对象的大小是{160, 568}
,所以我在animation开始之前将UITableView
的大小改为{160, 920}
。
关于未知的animation曲线,我只是将参数设置为animationCurve << 16
将其从视图animation曲线转换为视图animation选项。
数值不等于线性,缓和,缓解animation曲线。
这是我的代码:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(_keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
和:
- (void)keyboardWillShow:(NSNotification *)aNotification { NSDictionary *userInfo = aNotification.userInfo; // // Get keyboard size. NSValue *beginFrameValue = userInfo[UIKeyboardFrameBeginUserInfoKey]; CGRect keyboardBeginFrame = [self.view convertRect:beginFrameValue.CGRectValue fromView:nil]; NSValue *endFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey]; CGRect keyboardEndFrame = [self.view convertRect:endFrameValue.CGRectValue fromView:nil]; // // Get keyboard animation. NSNumber *durationValue = userInfo[UIKeyboardAnimationDurationUserInfoKey]; NSTimeInterval animationDuration = durationValue.doubleValue; NSNumber *curveValue = userInfo[UIKeyboardAnimationCurveUserInfoKey]; UIViewAnimationCurve animationCurve = curveValue.intValue; // // Create animation. CGRect tableViewFrame = self.tableView.frame; bTableViewFrame.size.height = (keyboardBeginFrame.origin.y - tableViewFrame.origin.y); self.tableView.frame = tableViewFrame; void (^animations)() = ^() { CGRect tableViewFrame = self.tableView.frame; tableViewFrame.size.height = (keyboardEndFrame.origin.y - tableViewFrame.origin.y); self.tableView.frame = tableViewFrame; }; // // Begin animation. [UIView animateWithDuration:animationDuration delay:0.0 options:(animationCurve << 16) animations:animations completion:nil]; }
您可以使用animateWithDuration
块并在其中设置曲线。 它干净,工作得很好。
UIViewAnimationCurve curve = [[notification.userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]; double duration = [[notification.userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; [UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState animations:^{ [UIView setAnimationCurve:curve]; /* ANIMATION HERE */ // don't forget layoutIfNeeded if you use autolayout } completion:nil];
快乐的编码!
UPDATE
你可以使用我写的一个简单的UIViewController类别https://github.com/Just-/UIViewController-KeyboardAnimation
要使用与键盘相同的animation,您必须使用未公开的“曲线”选项。
- (void)keyboardWillHide:(NSNotification *)notification { NSDictionary *userInfo = [notification userInfo]; CGRect rect = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; NSTimeInterval animationDuration = [[userInfo valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]; NSInteger curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue] << 16; [UIView animateWithDuration:animationDuration delay:0.0 options:curve animations:^{ } completion:nil]; }
我发现实际上方法animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
所有animation现在在iOS7和iOS8 animateWithDuration:delay:usingSpringWithDamping:initialSpringVelocity:options:animations:completion:
的新方式。 你只要做出正确的持续时间,阻尼和速度,你会得到相同的效果,但即使你可以改变速度/时间。
相反,使用UIKeyboardWillChangeFrameNotification
,因为一些国际键盘,如中文键盘,在使用过程中改变高度。 此代码也为您提供键盘的正确高度,即使在横向模式下也是如此。 (注意:下面的代码是用于Autolayout的 )
//set your observer, in a method like viewDidLoad [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil]; - (void)keyboardWillChange:(NSNotification *)notification { CGRect initialRect = [notification.userInfo[UIKeyboardFrameBeginUserInfoKey] CGRectValue]; CGFloat initialHeight = self.view.frame.size.height - [self.view convertRect:initialRect fromView:nil].origin.y; CGRect keyboardRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue]; CGFloat newHeight = self.view.frame.size.height - [self.view convertRect:keyboardRect fromView:nil].origin.y; //set your constraints here, based on initialHeight and newHeight, which are the heights of the keyboard before & after animation. [self.contentView setNeedsUpdateConstraints]; [UIView beginAnimations:nil context:nil]; [UIView setAnimationDuration:[notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[notification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; [UIView setAnimationBeginsFromCurrentState:YES]; [self.contentView layoutIfNeeded]; [UIView commitAnimations]; }
注册通知:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillShow:) name:UIKeyboardWillShowNotification object:nil];
通过animation改变视图的frame.origin.y来响应。
- (void)keyboardWillShow:(NSNotification *)aNotification { NSDictionary *userInfo = aNotification.userInfo; NSValue *endFrameValue = userInfo[UIKeyboardFrameEndUserInfoKey]; CGRect keyboardEndFrame = [self.view convertRect:endFrameValue.CGRectValue fromView:nil]; [UIView beginAnimations:nil context:NULL]; [UIView setAnimationDuration:[aNotification.userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue]]; [UIView setAnimationCurve:[aNotification.userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue]]; [UIView setAnimationBeginsFromCurrentState:YES]; CGRect searchButtonFrame = self.searchButton.frame; searchButtonFrame.origin.y = (keyboardEndFrame.origin.y - searchButtonFrame.size.height); self.searchButton.frame = searchButtonFrame; [UIView commitAnimations]; }