2015-04-10 2 views
5

Я добавил пользовательскую кнопку «Готово» на цифровую клавиатуру, используя решение, размещенное в других потоках, like this one. Что-то изменилось с обновлением до 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]; 
      } 
     } 
    } 
} 
} 

ответ

4

У меня была такая же проблема, я решил эту проблему, добавив кнопку непосредственно в 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]; } 
+0

это решение работает для всех случаев. все iPhone и все версии iOS? – hasan83

+1

уверен, мой проект поддерживает iOS 7+ –

0

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]; 
     } 
    } 

}