Я тестирую приложение 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];
}
}
Вы можете видеть из изображений выше, что если пользователь нажимает на textView, scrollView не прокручивается в нужную позицию (вы должны иметь возможность видеть текстовое содержимое textView).
Странно то, что я вручную попытался изменить смещение y scrollPoint на разные значения, но, похоже, это не повлияло на то, где прокручивается окно. Что я делаю неправильно?
Другие вещи, которые могут быть важны:
- меня autolayout выключен (так что пользователь может прокручивать по вертикали с этой точки зрения).
- TextView не прокручивать (он изменен, чтобы соответствовать его содержимое)
Редактировать
Я обнаружил, что если я добавляю мое смещение к contentInsets следующим образом:
UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height+50.0, 0.0);
вид переместится в нужное положение. Единственным недостатком является то, что есть дополнительная обивка в нижней части:
есть лучший способ сделать это?