```
@property (nonatomic, strong) NSLayoutConstraint *bottomConstraint;
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChangeFrame:) name:UIKeyboardWillChangeFrameNotification object:nil];
- (void)keyboardWillChangeFrame:(NSNotification *)notification {
NSDictionary *keyboardInfo = notification.userInfo;
double animateDuration = [[keyboardInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect endFrame = [[keyboardInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
BOOL heightRefresh = CGRectGetHeight([UIScreen mainScreen].bounds) - CGRectGetMinY(endFrame) > 0;
if (!self.superview) {
return;
}
if (!self.bottomConstraint) {
for (NSLayoutConstraint *constraint in [self.superview constraints]) {
if (constraint.firstAttribute == NSLayoutAttributeBottom && constraint.firstItem == self) {
self.bottomConstraint = constraint;
break;
}
}
}
if (!self.bottomConstraint) {
return;
}
CGFloat heightOffset = 0;
if (heightRefresh) {
heightOffset = -CGRectGetHeight(endFrame);
}
self.bottomConstraint.constant = heightOffset;
[UIView animateWithDuration:animateDuration animations:^{
[self.superview layoutIfNeeded];
[self layoutIfNeeded];
}];
}
```