Alternative access to keyboard height
2015-07-31 15:50
309 查看
使用另类的方式获取键盘高度
传统获取键盘高度的方式
[[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardDidShow) name: UIKeyboardDidShowNotification object: nil]; [[NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardDidHide) name: UIKeyboardDidHideNotification object: nil];
传统的方式很安全,很好用,但是存在着一个问题,它的产生必须是跟着键盘出现同时存在的。假设如果我有一个临时创建的界面需要知道键盘的高度,那我是没办法知道的。那我就需要有一个长期存在的对象去存储这些信息。也不能使用延后出现的对象,因为如果这个对象是键盘出现后在出现的情况下,再出现,那即使它注册了以上两个ID【UIKeyboardDidShowNotification,UIKeyboardDidHideNotification】,也是无济于事。因为这两个ID只有当键盘变化的时候才会回调。
另类的获取键盘方式
#if !defined(SV_APP_EXTENSIONS) UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if ([testWindow isKindOfClass: NSClassFromString(@"UITextEffectsWindow")]) { keyboardWindow = testWindow; break; } } if (keyboardWindow) { for (UIView *possibleKeyboard in [keyboardWindow subviews]) { if ([possibleKeyboard isKindOfClass: NSClassFromString(@"UIPeripheralHostView")] || [possibleKeyboard isKindOfClass: NSClassFromString(@"UIKeyboard")]) { return CGRectGetHeight(possibleKeyboard.bounds); } else if ([possibleKeyboard isKindOfClass: NSClassFromString(@"UIInputSetContainerView")]) { for (UIView *possibleKeyboardSubview in [possibleKeyboard subviews]) { if ([possibleKeyboardSubview isKindOfClass: NSClassFromString(@"UIInputSetHostView")]) { CGRect aKeyBoardFrame = possibleKeyboardSubview.frame; CGRect aScreenFrame = [UIScreen mainScreen].bounds; CGFloat aScreenHeight = CGRectGetWidth(aKeyBoardFrame) == CGRectGetWidth(aScreenFrame) ? CGRectGetHeight(aScreenFrame) : CGRectGetWidth(aScreenFrame); CGFloat aKeyBoardHeight = aScreenHeight - CGRectGetMinY(aKeyBoardFrame); return aKeyBoardHeight; } } } } } #endif
对于我们无法从正常的方式获取键盘的高度时,这个时候,传统的方式无法入手,我们就直接去窥视键盘其实本质是什么。
首先,为什么键盘会永远顶置??我们从我们最高层的地方看,我们制作的视图都是在keyWindow上,那我们思考下,如果要在顶置视图,那我们就需要创建一个新的UIWindow高于我们平常用的keyWindow.那答案就是键盘是存在于一个UIWindow上。键盘是存在于类名为UITextEffectsWindow的上。
其次,我们就要从UIWindow中寻找键盘真正的界面了。具体怎样找,可以看下上面的查询过程。
想必很多人都会觉得这种方式岂不是黑科技,这样钻漏洞。但是我想的是,我们做技术的,想必想要去了解其实UIView,CALayer等技术内部是做什么的,有什么结构。如果当我们真的深入去了解到它背后在做什么的时候,那一切都将会是可控的。我们可以去做我们想要的效果,而不再是官方提供什么,我们用什么。
别以为Apple就那么封闭,其实人家有开源自己控件的项目,只是研究的人比较少而已。Apple开源项目,就说到这里吧
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器
- iOS开发之路--微博OAuth授权_取得用户授权的accessToken
- ios通过按钮点击异步加载图片
- ios中图像进行压缩方法汇总
- IOS检测指定路径的文件是否存在
- iOS、Mac OS X系统中编程实现汉字转拼音的方法(超级简单)