Возникли проблемы с сокрытием клавиатуры с помощью невидимой кнопки, расположенной поверх uiscrollview - PullRequest
0 голосов
/ 01 марта 2011

У меня в игре 3 предмета ...

1) UIView находится в основании иерархии и содержит UIScrollview. 2) UIScrollview, представляющий длинную форму пользователя. 3) Невидимая кнопка в UIScrollview, которую я использую, чтобы предоставить функции «скрыть клавиатуру».

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

Моя проблема, похоже, одна из "слоев". Смотрите ниже, где я вставляю кнопку в представление с индексом: 0. Это приводит к тому, что кнопка активируется и «наполняется» за просмотром прокрутки, поэтому при нажатии на нее просмотр прокрутки захватывает касание, а кнопка не распознается. Нет возможности «дотянуться» до кнопки и подавить клавиатуру.

Однако, если я вставлю atIndex: 1, кнопка будет наложена на верхнюю часть полей ввода текста, и таким образом на любое прикосновение воздействует кнопка, которая немедленно подавляет клавиатуру и затем исчезает.

Как мне вставить кнопку сверху UIScrollview, но за UITextfields, которые там находятся?


другая логистика: у меня есть - (пустая) функция скрытой клавиатуры, которую я настроил с UIButtion как IBAction (). И у меня UIButton подключен к «владельцу файлов» через Ctrl-перетаскивание / падение. (Нужны ли мне оба этих соглашения?)

Этот код в ViewDidLoad () ...

[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification){

[self.view insertSubview:self.keyboardDismissalButton atIndex:0];

}];

Ответы [ 3 ]

2 голосов
/ 01 марта 2011

Вот отличный способ сделать это, даже не нуждаясь в невидимой кнопке. Этот подход будет работать только на устройствах к северу от 3.2, но, поскольку мы уже используем блочные методы в NSNotificationCenter, мы знаем, что по крайней мере на уровне 4.0.

Вместо кнопки мы вместо этого добавляем в наше представление распознаватель жестов касания. Этот распознаватель жестов касания вызывает -dismissKeyboard:, а затем мы просим наше представление завершить все редактирование. Этот метод доступен только в 3.2 и более поздних версиях и работает через его подпредставления, пока не найдет текущий firstResponder и не отправит его -resignFirstResponder. Логический аргумент, который принимает -endEditing:, определяет, будет ли принудительная отставка firstResponder принудительной или нет. Документация немного расплывчата, но я предполагаю, что при принудительном вызове метод делегата -textFieldShouldEndEditing для UITextField вызываться не будет.

- (void)viewDidLoad
{
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification) {
        UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard:)];
        tap.numberOfTapsRequired = 1;
        tap.numberOfTouchesRequired = 1;
        [self.view addGestureRecognizer:tap];
    }];

    [[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification) {
        [self.view removeGestureRecognizer:[self.view.gestureRecognizers lastObject]];
    }];
}

- (void)dismissKeyboard:(UIGestureRecognizer *)gesture
{
    [self.view endEditing:NO];
}
0 голосов
/ 01 марта 2011

Понял это ....

Вот ответ.

Код ниже находится внутри ViewDidLoad () UIViewController.Начните с полного удаления кнопки из UIView.(он будет отображаться при активации клавиатуры).

Обратите внимание на уведомление «WillShow» на клавиатуре ниже, что я вставляю кнопку в слой UIScrollView, а не в слой UIView, как раньше.Однако, как только кнопка нажата и клавиатура собирается быть закрыта, я полностью удаляю кнопку из UIView (то есть self).

[self.keyboardDismissalButton removeFromSuperview];


[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillShowNotification object:nil queue:nil usingBlock:^(NSNotification *notification){

[theScroller insertSubview:self.keyboardDismissalButton atIndex:0];

}];



[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardWillHideNotification object:nil queue:nil usingBlock:^(NSNotification *notification){

        [self.keyboardDismissalButton removeFromSuperview];

}];
0 голосов
/ 01 марта 2011

Невозможно видеть перед родным братом, кроме детей родного брата. Вы можете вставить кнопку как дочерний элемент представления прокрутки (за всеми текстовыми полями), или вы можете переопределить pointInside:withEvent: в верхнем представлении, чтобы вернуть false, если оно находится над текстовым полем, и true в противном случае (эффективно «пробивая отверстия»). в нем).

...