您的位置:首页 > 移动开发 > IOS开发

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【UIKeyboardDidShowNotificationUIKeyboardDidHideNotification】,也是无济于事。因为这两个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开源项目,就说到这里吧
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ios