Получение уведомлений от пользовательской кнопки «Готово» на цифровой клавиатуре не работает в iOS 8.3

Я добавил пользовательскую кнопку «Готово» на цифровую клавиатуру, используя решение, опубликованное в других потоках, как этот. Что-то изменилось с обновлением до iOS 8.3, так как кнопка все еще появляется, но сенсорные уведомления никогда не срабатывают. Перемещение кнопки из представления клавиатуры в суперпредставление портит расположение кнопки, но доказывает, что уведомления для управления работают.

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

- (void)addButtonToKeyboard
{
// create custom button
self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.doneButton.frame = CGRectMake(0, 163+44, 106, 53);
self.doneButton.adjustsImageWhenHighlighted = NO;
[self.doneButton setTag:67123];
[self.doneButton setImage:[UIImage imageNamed:@"doneup1.png"]        forState:UIControlStateNormal];
[self.doneButton setImage:[UIImage imageNamed:@"donedown1.png"] forState:UIControlStateHighlighted];

[self.doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

// locate keyboard view
int windowCount = [[[UIApplication sharedApplication] windows] count];
if (windowCount < 2) {
    return;
}

UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIView* keyboard;

for(int i = 0 ; i < [tempWindow.subviews count] ; i++)
{
    keyboard = [tempWindow.subviews objectAtIndex:i];
    // keyboard found, add the button

    if([[keyboard description] hasPrefix:@"<UIPeripheralHost"] == YES){
        UIButton* searchbtn = (UIButton*)[keyboard viewWithTag:67123];
        if (searchbtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
            [keyboard addSubview:self.doneButton];

    }//This code will work on iOS 8.0
    else if([[keyboard description] hasPrefix:@"<UIInputSetContainerView"] == YES){

        for(int i = 0 ; i < [keyboard.subviews count] ; i++)
        {
            UIView* hostkeyboard = [keyboard.subviews objectAtIndex:i];

            if([[hostkeyboard description] hasPrefix:@"<UIInputSetHost"] == YES){
                UIButton* donebtn = (UIButton*)[hostkeyboard viewWithTag:67123];
                if (donebtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
                    [hostkeyboard addSubview:self.doneButton];
            }
        }
    }
}
}

person EdFromCali    schedule 10.04.2015    source источник


Ответы (2)


У меня была та же проблема, я решил эту проблему, добавив кнопку непосредственно в UITextEffectsWindow. Также я изменил рамку кнопки.

- (void)addButtonToKeyboar {
// create custom button
self.doneButton = [UIButton buttonWithType:UIButtonTypeCustom];
self.doneButton.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height - 53, [[UIScreen mainScreen] bounds].size.width / 3, 53);
self.doneButton.adjustsImageWhenHighlighted = NO;
[self.doneButton setTag:67123];
[self.doneButton setImage:[UIImage imageNamed:@"doneup1.png"]        forState:UIControlStateNormal];
[self.doneButton setImage:[UIImage imageNamed:@"donedown1.png"] forState:UIControlStateHighlighted];

[self.doneButton addTarget:self action:@selector(doneButton:) forControlEvents:UIControlEventTouchUpInside];

// locate keyboard view
int windowCount = [[[UIApplication sharedApplication] windows] count];
if (windowCount < 2) {
    return;
}

UIWindow* tempWindow = [[[UIApplication sharedApplication] windows] objectAtIndex:1];
UIButton* donebtn = (UIButton*)[tempWindow viewWithTag:67123];
if (donebtn == nil)//to avoid adding again and again as per my requirement (previous and next button on keyboard)
    [tempWindow addSubview:self.doneButton]; }
person Alex Ostroushko    schedule 13.04.2015
comment
это решение работает для всех случаев. все iPhone и все версии iOS? - person hasan; 16.08.2015
comment
конечно, мой проект поддерживает iOS 7+ - person Alex Ostroushko; 17.08.2015

objectAtIndex:1 не может каждый раз указывать индекс окна. Таким образом, код должен проверять по своему описанию, является ли окно UITextEffectsWindow или нет, как показано ниже.

if (windowCount < 2) {
    return;

} else {
    periodButton.frame = CGRectMake(0, [[UIScreen mainScreen] bounds].size.height - 53, 106, 53);
    for (UIWindow *window in [[UIApplication sharedApplication] windows]) {
        if ([[window description] hasPrefix:@"<UITextEffectsWindow"]) {
            [window addSubview:periodButton];
        }
    }

}
person conecon    schedule 21.04.2015