2013-11-01 4 views
11

У меня есть один вид на моей раскадровке, чтобы показать форму регистрации пользователя, поэтому она выглядит так: main view-> прокрутка в представлении-> просмотр содержимого-> два текстовых поля и кнопка входа в систему верхняя и одна кнопка регистрации внизу представления. Я использую автозапуск, а нижняя кнопка имеет ограничение на нижнее пространство. Когда я нажимаю на текстовое поле и клавиатуру, я хотел бы прокрутить представление, чтобы изменить размер на видимый прямоугольник, но размер содержимого должен оставаться прокруткой вниз до кнопки регистрации, но кнопка перемещается вверх, когда изменяется размер прокрутки. Как я мог делать то, что хочу?iOS AutoLayout с scrollview и клавиатурой

Я использую этот код, когда появится клавиатура:

- (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]; 
    }]; 
} 

ответ

29

Попробуйте оставить размер контента в одиночку, и вместо того, чтобы изменения вида скроллинга contentInset свойства. Тогда вам не нужно возиться с ограничениями.

- (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; 
} 
+0

Спасибо. Оно работает. –

+0

Отличный ответ; отлично работает для меня! Благодаря! –

+1

приятный и простой, но одна проблема заключается в том, что полосы прокрутки не изменяются до видимой части вида прокрутки/таблицы/коллекции. –

1

Лучший способом я нашел, чтобы переопределить 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 изменить тип класса нарушившего ограничения к этому классу.

Смежные вопросы