ios – 如何在使用“自动布局”弹出键盘时调整视图大小

前端之家收集整理的这篇文章主要介绍了ios – 如何在使用“自动布局”弹出键盘时调整视图大小前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个视图(在这种情况下是UITableView,但这并不重要)在我的UIViewController上,我希望在键盘弹出时调整高度.

自动布局中执行此操作的最佳方法是什么?目前在视图中我有这些约束:

>超级视图的顶级空间:0
>超级视图的尾随空格:0
>超级视野的领先空间:0
>底层空间到superview:0
>身高等于= 424

我认为最快的方法删除高度和底部空间约束,并在调用keyboardDidAppear通知时调整代码中的实际视图,但还有其他方法吗?

编辑:我删除了高度限制,我的坏.

解决方法

我会给你一个通用的想法,它可能需要根据你的实际项目进行重新调整.

swift 4.x

let notificationTokenKeyboardWillAppear = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillShow,object: nil,queue: nil) { (note) in
    guard let keyboardFrame = (note.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue else { return }
    UIView.animate(withDuration: CATransaction.animationDuration(),animations: {
        tableView.contentInset = UIEdgeInsets(top: 0.0,left: 0.0,bottom: keyboardFrame.size.height,right: 0.0)
    },completion: nil)
}

let notificationTokenKeyboardWillHide = NotificationCenter.default.addObserver(forName: NSNotification.Name.UIKeyboardWillHide,queue: nil) { (_) in
    UIView.animate(withDuration: CATransaction.animationDuration(),animations: {
        tableView.contentInset = .zero
    },completion: nil)
}

注意:当您要释放视图并且不再需要基于闭包的观察者时,您需要通过调用removeObserver(_:)方法手动删除令牌

ObjC

我认为UITableView * _tableView已经在以前的某个地方正确设置了.

- (void)viewDidLoad {

    // ...

    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
        id _obj = [note.userInfo valueForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect _keyboardFrame = CGRectNull;
        if ([_obj respondsToSelector:@selector(getValue:)]) [_obj getValue:&_keyboardFrame];
        [UIView animateWithDuration:0.25f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
            [_tableView setContentInset:UIEdgeInsetsMake(0.f,0.f,_keyboardFrame.size.height,0.f)];
        } completion:nil];
    }];

    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
        [UIView animateWithDuration:0.25f delay:0.f options:UIViewAnimationOptionCurveEaseInOut animations:^{
            [_tableView setContentInset:UIEdgeInsetsZero];
        } completion:nil];
     }];


     // ...

}

注意:如果您的UITableView不在屏幕的底部,则应在此行中细化contentInset值:[_ tableView setContentInset:UIEdgeInsetsMake(0.f,_ keyboardFrame.size.height,0.f)] ;

猜你在找的iOS相关文章