東引甌越

不断学习, 与时俱进.

嗨,我是孙亚洲(@sunyazhou13),一名来自北国冰城的iOS开发者,也搞过一些mac.现居帝都北京.开发数年有余,没有为往圣续绝学深感惭愧,始于2016.望诸位同仁多多指教.


iOS键盘动画细节

前言

很久没写技术文章里,本篇记录了一下一个键盘弹出的小细节动画,像微信一样流程

上图

动画细节代码

细节核心主要是通知中的一些key

  • 动画时长
  • 动画的出现方式

下面的通知是接收 键盘将要出现的通知UIKeyboardWillShowNotification

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didReceiveKeyboardShowNotification:)
name:UIKeyboardWillShowNotification
object:nil];

然后是实现的核心代码

- (void)didReceiveKeyboardShowNotification:(NSNotification *)noti {
NSDictionary *userInfo = noti.userInfo;
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];
UIViewAnimationOptions animationOptions = animationCurve << 16;
self.bottomConstrains.offset = -CGRectGetHeight(keyboardFrame);
[UIView animateWithDuration:animationDuration delay:0. options:animationOptions animations:^{
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];
}

self.bottomConstrains.offset = -CGRectGetHeight(keyboardFrame); 是我写的约束 详细请参考demo

键盘消失也是一样的 UIKeyboardWillHideNotification 接收这个key

[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(didReceiveKeyboardHideNotification:)
name:UIKeyboardWillHideNotification
object:nil];

消失的时候 把约束偏移量设置0即可

- (void)didReceiveKeyboardHideNotification:(NSNotification *)noti {
NSDictionary *userInfo = noti.userInfo;
NSTimeInterval animationDuration;
UIViewAnimationCurve animationCurve;
CGRect keyboardFrame;
[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] getValue:&animationCurve];
[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] getValue:&animationDuration];
[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] getValue:&keyboardFrame];
UIViewAnimationOptions animationOptions = animationCurve << 16;
self.bottomConstrains.offset = 0;
[UIView animateWithDuration:animationDuration delay:0. options:animationOptions animations:^{
[self.view setNeedsUpdateConstraints];
[self.view layoutIfNeeded];
} completion:^(BOOL finished) {
}];
}

self.bottomConstrains.offset = 0; //设置偏移量会原来位置

利用Masonry做的动画

最后 别忘记移除通知

- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}

总结

键盘弹出这个微小的细节 很容易被大家忽视,写这篇文章是为了记录知识和技巧,希望各位多多指教

Demo点击这里下载

全文完

最近的文章

iOS扩大UIButton的点击的响应范围

前言开发过程中经常遇到UIButton点击区域太小 又不想 改动按钮的大小. 今天的文章和大家分享一下解决这种问题的代码 实现思路 子类话UIButton 复写 它的hitTest:方法 子类话UIButton 复写 point:inside:withEvent: 方法 第一种方式override …

于  iOS开发, macOS开发 继续阅读
更早的文章

船与灯塔

前言 荷兰🇳🇱被称为”海上马车夫”,今天讲述的故事与海上马车夫的有关的爱情故事,但它属于东方,属于中国。 船🚢它是一搜小船,船上有两只船桨,这艘船从驶出造船厂的时候,就被定义为普通货物运输船只,载重不超过1吨,造这艘船的主人希望能靠这只船养家糊口,但又舍不得花更多的钱买好的木料来制造它。 灯塔 …

于  文学 继续阅读