Кнопка UIB в представлении нижнего колонтитула таблицы не реагирует на прикосновения при отображении клавиатуры - PullRequest
1 голос
/ 03 апреля 2012

Я занимаюсь разработкой приложения для iPhone, в котором есть корзина для покупок, и использую UITableView для отображения корзины.Для каждого элемента есть ячейка, а для -tableFooterView установлено пользовательское представление, которое дает пользователю текстовое поле для проверки CVV их кредитной карты и кнопку для завершения процесса оформления заказа.

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

- (void)keyboardWillShow:(NSNotification *)n
{   
    // I'll update this to animate and scroll the view once everything works 
    self.theTableView.frameHeight = self.view.frameHeight - KEYBOARD_HEIGHT_PORTRAIT_IPHONE;
}

После ввода CVV пользователь может нажать клавишу Готово, чтобы закрыть клавиатуру:

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
    [textField resignFirstResponder];
    return NO;
}

Все это работает, однако, пока клавиатура видна, моя проверкаКнопка (обычная кнопка UIB) не реагирует на сенсорные события.Таблица прокручивается, но событие touchUpInside кнопки никогда не запускается.

После нажатия кнопки Готово и отклонения клавиатуры кнопка извлечения распознает события touchUpInside.

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

То же поведение при работе на iOS 5 и iOS 4.

Может кто-нибудь предложитькакие-либо предложения о том, что может происходитьИли какие-нибудь полезные идеи для устранения неполадок?

Спасибо!

Редактировать - обновить

Фактически, часть tableFooterView, которая покрыта клавиатуройне отвечает на сенсорные события.В моем пользовательском подклассе UIView я реализовал -touchesBegan:withEvent: и просто регистрировал, что произошло касание.

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

Также я только что понял, что часть tableFooterView, которая была покрыта клавиатурой, превращается в цвет фона содержащего представления, когда я прокручиваю эту часть, чтобы она стала видимой.

Ответы [ 3 ]

1 голос
/ 28 апреля 2012

У меня была такая же проблема.Я думаю, что это ошибка в iOS, но я нашел обходной путь для нее:


- (void)keyboardWillShow:(NSNotification *)note {
    NSDictionary* userInfo = [note userInfo];

    // get the size of the keyboard
    NSValue *boundsValue = [userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey];
    CGSize keyboardSize = [boundsValue CGRectValue].size; // screen size
    CGFloat keyboardHeight;
    if (self.interfaceOrientation == UIInterfaceOrientationPortrait || 
        self.interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
        keyboardHeight = keyboardSize.height;
    } else {
        keyboardHeight = keyboardSize.width;
    }

    // resize the view with the keyboard
    __block CGRect origFrame = self.view.frame;
    __block CGRect viewFrame = origFrame;
    viewFrame.size.height -= keyboardHeight - ((self.tabBarController != nil) ? self.tabBarController.tabBar.frame.size.height : 0);
    // Set the height to zero solves the footer view touch events disabled bug
    self.view.frame = CGRectMake(origFrame.origin.x, origFrame.origin.y,
                                 viewFrame.size.width, 0);
    // We immediately set the height back in the next cycle, before the animation starts
    dispatch_sync(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        self.view.frame = origFrame; // The original height
        // start the animation
        [UIView animateWithDuration:0.4 animations:^{
            [self.view setFrame:viewFrame];
        }];
    });
}

Хитрость заключается в том, чтобы установить высоту tableView равной 0 и вернуться к исходной в следующем рабочем цикле.

Это работает для меня либо iOS 4.3 и 5.1.

0 голосов
/ 05 марта 2018

У меня сработало следующее.

Был нижний колонтитул табличного представления с кнопкой, для этой кнопки действие связывается через xib, кроме того, добавлен следующий код далее -

@IBOutlet private weak var myButton: CustomUIButton!

override public func awakeFromNib() {
    super.awakeFromNib()

    let myButtonTapGesture = UITapGestureRecognizer(target: self, action: #selector(myButtonAction(_:)))
    myButton.addGestureRecognizer(myButtonTapGesture)
}

@IBAction func myButtonAction(_ sender: AnyObject) {
    // button action implementation
}

Поэтому я должен добавить жест касания кнопки.

0 голосов
/ 18 апреля 2012

Я думаю, что изменение размера UITableView заставляет его отправлять UIButton (подпредставление) в конец иерархии представления.Возможно, вам придется явно перенести его на передний план после изменения размера рамки.

[self.theTableView bringSubviewToFront:yourUIButton];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...