В контексте iPhone:
У меня есть UIScrollView
, содержащий UIImage
. Когда пользователь нажимает на экран внутри UIImage
, там, где пользователь коснулся, добавляется UITextField
. Пользователь может редактировать это UITextField
, и текстовое поле автоматически изменит свой размер в зависимости от того, был ли текст добавлен или удален.
Когда редактируемый a UITextField
увеличивает его ширину, представление прокрутки автоматически прокручивается, чтобы показать увеличенную ширину.
Проблема возникает потому, что автоматическая прокрутка текстового поля не учитывает значение y на экране
Например, скажем, пользователь добавил текстовое поле внизу изображения. Когда они перейдут к редактированию этого текстового поля, появится клавиатура, скрывающая текстовое поле. У меня есть код для прокрутки экрана, чтобы показать текстовое поле. Проблема возникает, когда пользователь вводит столько текста, что это текстовое поле выходит за край экрана. Когда это происходит, экран прокручивается по горизонтали, чтобы вместить более широкий текст, но также и по вертикали - вертикальная прокрутка заканчивается тем, что скрывает текстовое поле, в основном сводя на нет все, что я сделал, чтобы показать текстовое поле.
Код для отображения текстового поля, если оно скрыто клавиатурой:
- (void)keyboardWasShown:(NSNotification*)notification
{
NSDictionary* info = [notification userInfo];
CGSize keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
self.offset = self.contentOffset;
CGRect frame = self.frame;
// self.activeField is the name of the field that is the current first responder - this just adds a little bit of padding
frame.size.height -= keyboardSize.height + (self.activeField.frame.size.height * 2);
if (!CGRectContainsPoint(frame, self.activeField.frame.origin)) {
CGPoint scrollPoint = CGPointMake(self.offset.x, self.activeField.frame.origin.y - keyboardSize.height + (activeField.frame.size.height * 2));
[self setContentOffset:scrollPoint animated:YES];
}
}
Вот код для увеличения размера текстового поля:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
CGSize stringSize = [string sizeWithFont:textField.font];
CGSize newSize = [newString sizeWithFont:textField.font];
// Make textField wider if we're close to running up against it
if (newSize.width > (textField.frame.size.width - self.widthOffset)) {
CGRect textFieldFrame = textField.frame;
if (stringSize.width > self.widthOffset) {
textFieldFrame.size.width += stringSize.width;
}
textFieldFrame.size.width += self.widthOffset;
textField.frame = textFieldFrame;
}
// Shrink the textField if there is too much wasted space
if ((textField.frame.size.width - newSize.width) > self.widthOffset) {
CGRect textFieldFrame = textField.frame;
textFieldFrame.size.width = newSize.width + self.widthOffset;
textField.frame = textFieldFrame;
}
return YES;
}
Вопрос в том, как заставить UIScrollView
уважать само значение y при автоматической прокрутке?