IOS AutoLayout с прокруткой и клавиатурой
У меня есть один вид на моем раскадровке, чтобы показать форму регистрации пользователя, поэтому он выглядит следующим образом: main view- > прокрутка → просмотр содержимого → два текстовых поля и кнопка входа вверху и одна кнопка регистрации на в нижней части окна. Я использую автозапуск, а нижняя кнопка имеет ограничение на нижнее пространство. Когда я нажимаю на текстовое поле и клавиатуру, я хотел бы прокрутить представление, чтобы изменить размер на видимый прямоугольник, но размер содержимого должен оставаться прокруткой вниз до кнопки регистрации, но кнопка перемещается вверх, когда изменяется размер прокрутки. Как я могу делать то, что хочу?
Я использую этот код, когда появляется клавиатура:
- (void)keyboardWillShow:(NSNotification *)aNotification
{
NSDictionary *info = [aNotification userInfo];
NSValue *kbFrame = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
NSTimeInterval animationDuration = [[info objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
CGRect keyboardFrame = [kbFrame CGRectValue];
CGSize s = self.scrollView.contentSize;
CGFloat height = keyboardFrame.size.height;
self.scrollViewBottomLayoutConstraint.constant = height;
[UIView animateWithDuration:animationDuration animations:^{
[self.view layoutIfNeeded];
[self.scrollView setContentSize:s];
}];
}
Ответы
Ответ 1
Попробуйте оставить размер содержимого отдельно, а вместо этого настройте свойство содержимого запроса прокрутки. Тогда вам не нужно связываться с ограничениями.
- (void)keyboardUp:(NSNotification *)notification
{
NSDictionary *info = [notification userInfo];
CGRect keyboardRect = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardRect = [self.view convertRect:keyboardRect fromView:nil];
UIEdgeInsets contentInset = self.scrollView.contentInset;
contentInset.bottom = keyboardRect.size.height;
self.scrollView.contentInset = contentInset;
}
Ответ 2
Лучший способ, который я нашел, - переопределить NSLayoutConstraint так:
@implementation NHKeyboardLayoutConstraint
- (void) dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void) awakeFromNib {
[super awakeFromNib];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillChangeFrame:)
name:UIKeyboardWillChangeFrameNotification
object:nil];
}
- (void)keyboardWillChangeFrame:(NSNotification *)notification {
CGRect endKBRect = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGFloat animationDuration = [notification.userInfo[UIKeyboardAnimationDurationUserInfoKey] floatValue];
CGRect frame = [UIApplication sharedApplication].keyWindow.bounds;
self.constant = frame.size.height - endKBRect.origin.y;
[UIView animateWithDuration:animationDuration animations:^{
[[UIApplication sharedApplication].keyWindow layoutIfNeeded];
}];
}
@end
то в xib измените тип класса ограничивающего ограничения на этот класс.