我有一个视图(在这种情况下是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) }
注意:当您要释放视图并且不再需要基于闭包的观察者时,您需要通过调用@L_404_1@方法手动删除令牌
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)] ;