2014-09-18 4 views
0

У меня есть простой UIScrollView с 2 UITextField s в нем и кусок кода, который не имеет для меня никакого смысла, но он работает.UITextField в UIScrollview

Это экран (я использую Auto Layout):

Here is the screen in the storyboard

Вот код:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillShow:) 
               name:UIKeyboardWillShowNotification 
               object:nil]; 
    [[NSNotificationCenter defaultCenter] addObserver:self 
              selector:@selector(keyboardWillHide:) 
               name:UIKeyboardWillHideNotification 
               object:nil]; 
} 

- (void)keyboardWillShow:(NSNotification*) notif 
{ 
    NSDictionary *info = [notif 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; 
} 

- (void) keyboardWillHide:(NSNotification*) notif 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    _scrollView.contentInset = contentInsets; 
} 

То, что я бы ожидать, чтобы переместить Scrollview на 352 точек до (высота клавиатуры), так как это значение, которое я установил contentInset.bottom, и не имеет значения, какой из UITextField выбран, так как высота клавиатуры всегда одна и та же.

Однако результат заключается в том, что он прокручивается вверх, поэтому UITextField, который является первым ответчиком, не будет закрыт клавиатурой. Таким образом, он прокручивает больше в случае нижнего UITextField и меньше в случае верхнего. Это выглядит намного лучше, чем ожидаемый результат, но я не могу понять, почему он работает. Кто-нибудь с объяснением?

enter image description here

enter image description here

ответ

1

Причина это происходит, что изменение врезки контента изменяет только вставку, она фактически не изменить contentOffset в Scrollview.

Смотрите эту SO разместить на прокрутку вида для клавиатуры: How do I scroll the UIScrollView when the keyboard appears?

С этого постом я думаю, что вам нужна часть в конце, который прокручивает вид, чтобы показать обоих поля

// If active text field is hidden by keyboard, scroll it so it's visible 
    // Your application might not need or want this behavior. 
    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    if (!CGRectContainsPoint(aRect, activeField.frame.origin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y-kbSize.height); 
     [scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
+0

Спасибо за ваш ответ. Я был доволен тем, как это работает, я просто не понимаю, почему это работает. Для меня «контент» в 'contentInset' означает как' UITextFields', так и пространство вокруг них, определенное 'contentSize'. Я не понимаю, как 'UIScrollView' знает, что' UITextField' активен и прокручивается именно там. – Levi

+0

Levi, возможно, он ищет текущего ответчика (например, startFirstResponder) и прокрутки к кадру для этого ответчика. –

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