XFAssistiveTouch
XFAssistiveTouch copied to clipboard
代码里 有个处理键盘的地方
` - (void)keyboardWillChangeFrame:(NSNotification *)notification {
// if ([[UIDevice currentDevice].systemVersion integerValue] >= 10) { // return; // }
/*因为动画过程中不能实时修改_assistiveWindowRect,
*所以如果执行点击操作的话,_assistiveTouchView位置会以动画之前的位置为准.
*如果执行拖动操作则会有跳动效果.所以需要禁止用户操作.*/
_assistiveWindow.userInteractionEnabled = NO;
NSDictionary *info = [notification userInfo];
CGFloat duration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGRect endKeyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
//根据实时位置计算于键盘的间距
CGFloat yOffset = endKeyboardRect.origin.y - CGRectGetMaxY(_assistiveWindow.frame);
//如果键盘弹起给_coverWindowPoint赋值
if (endKeyboardRect.origin.y < CGRectGetHeight([UIScreen mainScreen].bounds)) {
_coverWindowPoint = _assistiveWindowPoint;
}
//根据间距计算移动后的位置viewPoint
CGPoint viewPoint = _assistiveWindow.center;
viewPoint.y += yOffset;
//如果viewPoint在原位置之下,将viewPoint变为原位置
if (viewPoint.y > _coverWindowPoint.y) {
viewPoint.y = _coverWindowPoint.y;
}
//如果_assistiveWindow被移动,将viewPoint变为移动后的位置
if (CGPointEqualToPoint(_coverWindowPoint, CGPointZero)) {
viewPoint.y = _assistiveWindow.center.y;
}
//根据计算好的位置执行动画
[UIView animateWithDuration:duration animations:^{
_assistiveWindow.center = viewPoint;
} completion:^(BOOL finished) {
//将_assistiveWindowRect变为移动后的位置并恢复用户操作
_assistiveWindowPoint = _assistiveWindow.center;
_assistiveWindow.userInteractionEnabled = YES;
//使其遮盖键盘
NSArray *windows = [UIApplication sharedApplication].windows;
[windows enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if([obj isKindOfClass:NSClassFromString(@"UITextEffectsWindow")]) {
if (obj && [obj respondsToSelector:@selector(windowLevel)]) {
CGFloat lv = [obj windowLevel];
_assistiveWindow.windowLevel = lv + 1;
}
*stop = YES;
}
}];
}];
}`
这个地方 改了下 IOS10 能用了 求REVIEW
我这里iOS10键盘弹起后还是会有抖动,而且界面会卡住。你的是系统是10.0还是10.1,等我升级10.1了再测下。
卡住 是你那句makeVisibleWindow 的问题 抖我没有关注。。。
注释后立马不卡了
makeVisibleWindow那段忘了改,以前的问题。的确是这句的问题。thank you。
NSArray *windows = [UIApplication sharedApplication].windows; [windows enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { if([obj isKindOfClass:NSClassFromString(@"UITextEffectsWindow")]) { if (obj && [obj respondsToSelector:@selector(windowLevel)]) { CGFloat lv = [obj windowLevel]; _assistiveWindow.windowLevel = lv + 1; } *stop = YES; } }];
这段代码应该是无法保证遮盖键盘的吧。
在iOS10以下,键盘的Window层级是最高的10^7 次方,超过10^7 的都按10^7计。如果处在同一层,则是谁后添加,谁在上。所以在动画执行完后刷新了XFAssistiveTouch,因为他本来就在最高层,刷新完就是后添加的,就会遮住键盘,在iOS9以下是可以的。所以这里的windowLevel = lv + 1也是没用的。
iOS10以后暂时没有研究系统做了什么处理,只要刷新就会卡主。这里我暂时在iOS10下不刷新了,但还可以随键盘弹起。
我这里 试了 是可以的 IOS 10.0 反正WINDOW LEVEL 设置 FLX_MAX 我试过是不行的
手机现在升了10.1不能调试,我用模拟器的iPhone7 10.0 测的你的这段代码是不能遮住键盘的。你还有改别处的代码吗?没有的话我明天真机测下再说吧。谢谢帮助调试。
makeVisibleWindow, 这样切换keyWindow在iOS 9以上还是有问题的,(iOS 10, iOS 11)