2014-09-06 2 views
0

Я тестирую приложение iOS с помощью симулятора 6.1. Я работал часами, чтобы прокрутить свой scrollView до правильной позиции, когда клавиатура видна (после того, как пользователь нажимает на textView). Я попытался следующие ответ помечается как правильно на этой странице:iOS: scrollView не прокручивается до правильного положения при видимой клавиатуре

How do I scroll the UIScrollView when the keyboard appears?

Это то, что я в настоящее время:

- (void)keyboardWasShown:(NSNotification*)aNotification { 
    NSLog(@"keyboardWasShown"); 

    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; 

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

} 

enter image description here

Вы можете видеть из изображений выше, что если пользователь нажимает на textView, scrollView не прокручивается в нужную позицию (вы должны иметь возможность видеть текстовое содержимое textView).

Странно то, что я вручную попытался изменить смещение y scrollPoint на разные значения, но, похоже, это не повлияло на то, где прокручивается окно. Что я делаю неправильно?

Другие вещи, которые могут быть важны:

  • меня autolayout выключен (так что пользователь может прокручивать по вертикали с этой точки зрения).
  • TextView не прокручивать (он изменен, чтобы соответствовать его содержимое)

Редактировать

Я обнаружил, что если я добавляю мое смещение к contentInsets следующим образом:

UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height+50.0, 0.0); 

вид переместится в нужное положение. Единственным недостатком является то, что есть дополнительная обивка в нижней части:

enter image description here

есть лучший способ сделать это?

ответ

1

Я использовал это с UITextField, а не UITextView, но я считаю, что он все равно должен работать одинаково. Это позволяет мне позиционировать текстовое поле непосредственно над клавиатурой.

keyboardWillShow это функция, когда NSNotificationCenter принимает UIKeyboardWillShowNotification

-(void) keyboardWillShow:(NSNotification *)note 
{ 
// Get the keyboard size 
CGRect keyboardBounds; 
[[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds]; 

// Start animation 
[UIView beginAnimations:nil context:NULL]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationDuration:0.3f]; 


// Get Keyboard height and subtract the screen height by the origin of the textbox and height of text box to position textbox right above keyboard 
self.scrollView.contentOffset = CGPointMake(0,keyboardBounds.size.height-([UIScreen mainScreen].bounds.size.height - commentBox.frame.origin.y - commentBox.frame.size.height)); 

[UIView commitAnimations]; 
} 
Смежные вопросы