不修改设备旋转的情况下弹出横屏键盘

目录
  1. 1. 情景
  2. 2. 思路
  3. 3. 解决

情景

映客直播之前做了一个游戏录屏的功能,可以进行直播手游,但是对于横屏情况下,用户的输入出现了一些问题。

默认只支持竖屏

在不改变设备支持的旋转方向的情况下,我们需要让键盘能够正常的从侧面弹出。

思路

对于视频横屏的解决方式一般都是通过使设备横屏的方式进行的,如果是手动触发横屏的方式,一般可以通过修改transform,并进行重新布局的方式进行。

但是对于侧面弹出键盘这件事,我简单思考之后发现有两个思路,一个是强制设备进入横屏状态,一个是通过手动弹出键盘,并修改键盘的弹出方式以及路径。

第一种方案很快发现是不可行的。因为项目需求是只支持竖屏,不能对设备进行横屏状态的获取,那么如果要设置强行横屏就无法绕过这个门槛。

第二种方案中,经过验证,发现键盘出现了多种诡异的情况,如键盘横屏了,但是还是居中显示等。而且由于对键盘弹出时的多种情况进行监听,发现承载系统键盘的View存在有很多层,无法确认具体哪层负责对View的渲染。所以这个让我一度陷入了困扰中。

解决

在对键盘的监听和处理的过程中,由于对键盘相关的父视图的多种处理都存在问题,我监听了更多的对象变化的特征。终于发现了触发横屏键盘的一种行之有效的方式 — window。

根据我对键盘在正常的横竖屏情况下的适配情况,我发现,键盘所在的window,在横屏状态下与在竖屏状态下的宽高正好是相反的,于是我大胆尝试在键盘弹出时,对键盘所属的window的bounds进行修改,并使用transform的方式,对window中的内容进行旋转。

结果非常好,我成功的触发了键盘的重绘,触发了只有在横屏情况下才能触发的侧面弹出键盘的方式。

下面上代码。

1
2
//监听键盘的弹出事件
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardFrameChanged:) name:UIKeyboardWillChangeFrameNotification object:nil];
1
2
3
4
5
6
7
8
9
10
11
12
13
- (void)keyboardFrameChanged:(NSNotification *)noti {
//获取键盘弹出的window
UIWindow *window = [UIApplication sharedApplication].windows.lastObject;
//开启事物,屏蔽键盘弹出动画
[CATransaction begin];
[CATransaction setDisableActions:YES];
//修改window的属性,触发键盘的横屏布局。
window.bounds = CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.height, [UIScreen mainScreen].bounds.size.width);
window.transform = CGAffineTransformMakeRotation(M_PI_2);
[CATransaction commit];
}
}

本作品采用 署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5)协议 进行许可,欢迎转载,但转载请注明来自SarielTang,并保持转载后文章内容的完整。本人保留所有版权相关权利。

本文永久链接:http://sarieltang.github.io/2016/11/07/知识点小结/2016-11-07/index/