Skip to content

代码里 有个处理键盘的地方 #1

@ivanyang1984

Description

@ivanyang1984

` - (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;
        }
    }];
}];

}`

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions