2013-11-23 1 views
0

У меня есть scrollview с несколькими текстовыми полями, в том числе в одной позиции Y. Я использую следующий код, чтобы скорректировать смещения scrollview/вставки, чтобы активное текстовое поле всегда было видимым, но если пользователь уже редактирует поле и затем нажимает на другое текстовое поле в той же «строке» (то же Y-позицию), scrollview отскакивает/исправляет. Есть ли способ обойти это?Как предотвратить зависание scrollview при настройке содержимого для клавиатурыWillBeShown/keyboardWillBeHidden

- (void)keyboardWillBeShown:(NSNotification*)aNotification 
{ 
    NSDictionary* info = [aNotification userInfo]; 
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size; 
    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0); 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 

    UIView *activeField = [self.view findFirstResponder]; 

    CGRect aRect = self.view.frame; 
    aRect.size.height -= kbSize.height; 
    aRect.size.height -= aRect.origin.y; 
    aRect.origin.y = 0; 

    CGPoint activeFieldOrigin = [activeField convertPoint:CGPointZero toView:self.view.window]; 

    if (!CGRectContainsPoint(aRect, activeFieldOrigin)) { 
     CGPoint scrollPoint = CGPointMake(0.0, activeFieldOrigin.y-kbSize.height); 
     [self.scrollView setContentOffset:scrollPoint animated:YES]; 
    } 
} 

- (void)keyboardWillBeHidden:(NSNotification*)aNotification 
{ 
    UIEdgeInsets contentInsets = UIEdgeInsetsZero; 
    self.scrollView.contentInset = contentInsets; 
    self.scrollView.scrollIndicatorInsets = contentInsets; 
} 

Я могу предотвратить поведение, выполнив setContentOffset: анимированный с анимированным = НЕТ. Поэтому я предполагаю, что при анимированном = YES он отбрасывает фактическую работу на блок или задерживает выполнение фактического набора, а затем, когда он/делает/фактически идет, чтобы сделать это, повторное шоу немедленно возвращает его обратно к тому же должность.

Мысли?

ответ

0

Вы можете сохранить текущую версию содержимого прокрутки, например contentOffsetY = _scrollView.contentOffset.y; и затем уточнить

if(contentOffsetY==_scrollView.contentOffset.y) 
{ 
//then should not change scrollviews content offset 
} 
else 
{ 
//change content offset 
} 
Смежные вопросы