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 измените тип класса ограничивающего ограничения на этот класс.