Самый простой способ предотвратить перемещение курсора за клавиатурой в iPhone SDK? - PullRequest
0 голосов
/ 19 июля 2010

У меня есть таблица с несколькими текстовыми полями .Нажатие на любую из UITextField s вызывает клавиатуру, и представление прокручивается автоматически, чтобы при необходимости поднять курсор над клавиатурой.

У меня есть метод, который вызывается при каждом нажатии клавиши Return.во время редактирования текстового поля, и я просто перемещаю статус первого респондента в следующее текстовое поле в этом.Однако, если он оказывается за клавиатурой, он не прокручивается и не раскрывается.

Я знаю, что это включает использование beginAnimations метода UIView и изменение положения или размера вида, ноЯ не знаю, как рассчитать, сколько должен двигаться вид и т. Д.?Есть простой способ сделать это?Я не думаю, что Apple объяснила это в документации, и я уже попробовала поиск в Google, но не смогла найти подходящее решение.

Любая помощь будет принята с благодарностью.

Спасибо.

Ответы [ 2 ]

1 голос
/ 21 июля 2010

Нашел решение для этого, благодаря 'mvds' здесь и некоторому копанию в документации.Вот как выглядит мой пересмотренный метод scrollViewToCenter:

- (void)scrollViewToCenter
{
    [self determineActiveTextField];
    CGPoint textFieldOrigin = [activeTextField convertPoint:activeTextField.frame.origin toView:self.view];
    CGFloat scrollPoint = self.view.frame.size.height / 2 - activeTextField.frame.size.height;
    if (textFieldOrigin.y > scrollPoint) {
        CGFloat scrollDistance = textFieldOrigin.y - scrollPoint;
        [self.tableView setContentOffset:CGPointMake(0.0f,scrollDistance) animated:YES];
    }
}

Я называю его всякий раз, когда пользователь нажимает на любое из текстовых полей (или это было сделано первым респондентом программно), добавляя его какселектор для уведомления «UITextFieldTextDidBeginEditingNotification», таким образом:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(scrollViewToCenter) name:UITextFieldTextDidBeginEditingNotification object:textField];

Когда метод вызывается, он сначала определяет, какое из семи текстовых полей является активным, а затем, используя метод convertPoint: toView:,преобразует исходную точку в точку «self.view».Как только у меня будет точка, из которой происходит текстовое поле, я вычисляю, находится ли оно ниже половины точки на экране, и, если это так, соответствующим образом смещаю представление таблицы, используя метод 'setContentOffset'.

опубликовал это очень подробно, потому что мне пришлось пойти на многое, чтобы выяснить, как это работает, и я подумал, что это может спасти кого-то другого в этот раз.Я надеюсь, что это было полезно.

0 голосов
/ 19 июля 2010

AFAIK, действительно, нет подходящего для разработчиков способа сделать это.Скопируйте и вставьте из другого проекта, вот что я придумал:

-(void)scrollViewToCenter:(UIView*)v
{
    CGFloat windowLeft = 200.0f;
    CGFloat y = v.frame.origin.y-(windowLeft - v.frame.size.height)/2;
    if ( y > scrollView.contentSize.height - windowLeft )
    {
        y = scrollView.contentSize.height - windowLeft;
    }
    if ( y < 0.0f ) y = 0.0f;
    [scrollView setContentOffset:CGPointMake(0.0f,y) animated:YES];
}

windowleft - это количество пикселей, оставшихся после выхода клавиатуры.Это предполагает, что у вас есть UIScrollView с именем scrollView.

, а затем просто позвоните

[self scrollViewToCenter:tf];

edit: Примечание: чтобы это работало, UIView переданный предпочтительно должен быть подпредставлением scrollView.

...