Problèmes de keyboard Webview personnalisés

Donc, l'adaptation du code de ce thread UIKeyboardAppearance dans UIWebView et la réponse géniale de TomSwift , j'ai eu environ 99% de travail.

Dans le simulateur iOS 7, tout semble fonctionner correctement. Cependant, dans iOS 8, lorsque le keyboard apparaît pour la première fois, la barre <> Terminé est blanche. Lorsque je tape ou sélectionne une autre input, elle change de couleur.

Ma question est, comment puis-je empêcher et / ou changer cette partie blanche?

Bar blancDark Bar

Tout le code de l'autre thread est identique, sauf pour ma couleur que j'appelle comme dans le keyboardWillAppear.

UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } // Locate UIWebFormView. for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([[possibleFormView description] hasPrefix : @"<UIInputSetContainerView"]) { for (UIView* peripheralView in possibleFormView.subviews) { peripheralView.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:0.75]; for (UIView* peripheralView_sub in peripheralView.subviews) { peripheralView_sub.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:0.75]; } } } } 

Toute aide serait grandement appréciée.

Donc, avec iOS 9+, j'ai trouvé qu'il cassait les methods mentionnées. Mais avec un peu de bricolage et en regardant quelques points de vue, je suis venu avec un ajout à ce que j'ai déjà répondu ci-dessous.

Maintenant, j'ai décidé de laisser tomber les trucs de couleur personnalisée, je creuse juste le keyboard noir, convient à mon application. De toute façon, voici ce qui fonctionne pour moi. Testé sur 9.1 sim à 7. Aussi sur mon 6+ fonctionnant 9.0.2.

 //Keyboard setting @interface UIWebBrowserView : UIView @end @interface UIWebBrowserView (UIWebBrowserView_Additions) @end @implementation UIWebBrowserView (UIWebBrowserView_Additions) - (id)inputAccessoryView { return nil; } - (UIKeyboardAppearance) keyboardAppearance{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL switchOn = [userDefaults boolForKey:@"darkKeyboard"]; if (switchOn) { return UIKeyboardAppearanceDark; } else { return UIKeyboardAppearanceDefault; } } @end @interface UITextInputTraits : UIWebBrowserView @end @interface UITextInputTraits (UIWebBrowserView) @end @implementation UITextInputTraits (UIWebBrowserView) - (UIKeyboardAppearance) keyboardAppearance{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL switchOn = [userDefaults boolForKey:@"darkKeyboard"]; if (switchOn) { return UIKeyboardAppearanceDark; } else { return UIKeyboardAppearanceDefault; } } @end 

J'espère vraiment que quelqu'un finda ces réponses utiles: D

MISE À JOUR: Était curieux au sujet de la barre faite, qui est comment tout a commencé. Je l'ai réactivé juste pour voir, et pour découvrir qu'il l'a changé en noir. Bon bonus, bien que je l'ai abandonné pour cacher le keyboard avec défilement.

UPDATE 12/19/15 J'ai donc décidé de faire la transition d'UIWebView à WKWebView, juste pour découvrir que, évidemment, les choses sont différentes entre les deux. J'ai réussi à le faire fonctionner à nouveau. Les appels réguliers d'UIKeyboardAppearanceDark font que le keyboard soit plus transparent que j'aime. Alors je l'ai modifié à mon goût. Encore une fois, probablement pas la façon standard de faire les choses, mais je m'en fous, ça ne va pas à la pomme de toute façon.

Tout est encore mis dans l'AppDelegate.

 //Removing the input bar above the keyboard. @interface InputHider : NSObject @end @implementation InputHider -(id)inputAccessoryView{ return nil; } @end @interface UIWebBrowserView : NSObject @end @interface NSObject (UIWebBrowserView_Additions) @end @implementation NSObject (UIWebBrowserView_Additions) - (UIKeyboardAppearance) keyboardAppearance{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL switchOn = [userDefaults boolForKey:@"darkKeyboard"]; if (switchOn) { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } // Locate UIWebFormView. for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetContainerView")] || [possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetHostView")]) { for (UIView* peripheralView in possibleFormView.subviews) { peripheralView.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:1.0]; //Keyboard background for (UIView* peripheralView_sub in peripheralView.subviews) { peripheralView_sub.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:1.0]; //Accessory bar color if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"WKContentView")]) { for (UIView* UIInputViewContent_sub in peripheralView_sub.subviews) { [[UIInputViewContent_sub layer] setOpacity : 1.0]; UIInputViewContent_sub.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:1.0]; } } } } } } return UIKeyboardAppearanceDark; } else { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } // Locate UIWebFormView. for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetContainerView")] || [possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIKeyboard")]) { for (UIView* peripheralView in possibleFormView.subviews) { peripheralView.backgroundColor = [UIColor clearColor]; //Keyboard background for (UIView* peripheralView_sub in peripheralView.subviews) { peripheralView_sub.backgroundColor = [UIColor clearColor]; //Accessory bar color if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIWebFormAccessory")]) { for (UIView* UIInputViewContent_sub in peripheralView_sub.subviews) { [[UIInputViewContent_sub layer] setOpacity : 1.0]; UIInputViewContent_sub.backgroundColor = [UIColor clearColor]; } } } } } } return UIKeyboardAppearanceDefault; } } @end @interface UITextInputTraits : UIWebBrowserView @end @interface UITextInputTraits (UIWebBrowserView) @end @implementation UITextInputTraits (UIWebBrowserView) - (UIKeyboardAppearance) keyboardAppearance{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL switchOn = [userDefaults boolForKey:@"darkKeyboard"]; if (switchOn) { return UIKeyboardAppearanceDark; } else { return UIKeyboardAppearanceDefault; } } @end //Disables endDisablingInterfaceAutorotationAnimated error for keyboard @interface UIWindow (UIWebBrowserView) - (void)beginDisablingInterfaceAutorotation; - (void)endDisablingInterfaceAutorotation; @end @implementation UIWindow (UIWebBrowserView) - (void)beginDisablingInterfaceAutorotation {} - (void)endDisablingInterfaceAutorotation{} @end 

Je n'ai pas réussi à find un moyen de masquer l'inputAccessoryBar comme je le faisais auparavant, mais grâce à quelques threads, j'ai réussi à le faire fonctionner. À mon avis, les controllers appellent:

 -(void)removeInputAccessoryView { UIView* subview; for (UIView* view in webView.scrollView.subviews) { if([[view.class description] hasPrefix:@"WKContent"]) subview = view; } if(subview == nil) return; NSSsortingng* name = [NSSsortingng ssortingngWithFormat:@"%@SwizzleHelper", subview.class.superclass]; Class newClass = NSClassFromSsortingng(name); if(newClass == nil) { newClass = objc_allocateClassPair(subview.class, [name cSsortingngUsingEncoding:NSASCIISsortingngEncoding], 0); if(!newClass) return; Method method = class_getInstanceMethod([AppDelegate class], @selector(inputAccessoryView)); class_addMethod(newClass, @selector(inputAccessoryView), method_getImplementation(method), method_getTypeEncoding(method)); objc_registerClassPair(newClass); } object_setClass(subview, newClass); } 

Et dans le viewDidLoad j'appelle:

 [self removeInputAccessoryView]; 

Je prévois de bricoler un peu plus, mais pour l'instant, cela fonctionne à ce que j'ai besoin de faire.

Alors que cela aurait été agréable de faire fonctionner cela, j'ai décidé de prendre l'approche de l'abandonner complètement, et à la place, en utilisant le robinet pour rejeter le keyboard.

J'avais l'printing que le cacher cacherait aussi la barre de correction automatique. Ce n'est pas le cas.

Voici le code complet avec lequel je travaille.

Code de couleur final pour le keyboard, qui est appelé par un interrupteur à bascule dans les parameters de mon application.

 NSUserDefaults *darkDefaults = [NSUserDefaults standardUserDefaults]; BOOL darkOn = [darkDefaults boolForKey:@"darkKeyboard"]; if (darkOn) { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } // Locate UIWebFormView. for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetContainerView")]) { for (UIView* peripheralView in possibleFormView.subviews) { //Keyboard background for (UIView* peripheralView_sub in peripheralView.subviews) { peripheralView_sub.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:0.75]; } } } } } else{ UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } // Locate UIWebFormView. for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetContainerView")]) { for (UIView* peripheralView in possibleFormView.subviews) { //Keyboard background for (UIView* peripheralView_sub in peripheralView.subviews) { peripheralView_sub.backgroundColor = [UIColor clearColor]; } } } } } 

Pour masquer le keyboard Appelé en haut de mon controller de vue (probablement pas Apple Safe, mais je n'ai pas besoin de publier, donc ça marche pour moi):

 @interface UIWebBrowserView : UIView @end @implementation UIWebBrowserView (CustomToolbar) - (id)inputAccessoryView { return nil; } @end 

Maintenant, à partir de mes tests, j'ai été capable de colorier en dessinant une nouvelle vue ou barre d'outils dans la partie inputAccessoryView, mais le robinet pour rejeter les dégâts avec lui, un ajustement serait nécessaire, mais ce n'est pas la barre normale normale. Tant pis.

Si vous vouliez implémenter la bascule comme je l'ai fait depuis une vue de table, voici comment je l'ai fait.

 - (id)init{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reloadTableView:) name:NSUserDefaultsDidChangeNotification object:nil]; return [self initWithStyle:UITableViewStyleGrouped]; } 

cellForRowAtIndexPath:

  [cell.textLabel setText:@"Dark Keyboard"]; cell.textLabel.textAlignment = NSTextAlignmentLeft; cell.selectionStyle = UITableViewCellSelectionStyleNone; darkKeyboard = [[UISwitch alloc] initWithFrame: CGRectMake(7, 0, 0, 0)]; cell.accessoryView = [[UIView alloc] initWithFrame:darkKeyboard.frame]; [cell.accessoryView addSubview:darkKeyboard]; [self.darkKeyboard addTarget:self action:@selector(updateSwitchAtIndexPath:) forControlEvents:UIControlEventValueChanged]; //On Color darkKeyboard.onTintColor = [UIColor colorWithRed:0.204 green:0.667 blue:0.863 alpha:0.85]; //Off Color darkKeyboard.backgroundColor = [UIColor colorWithRed:0.678 green:0.161 blue:0.188 alpha:0.75]; darkKeyboard.TintColor = [UIColor clearColor]; darkKeyboard.layer.cornerRadius = 16.0; //Risize darkKeyboard.transform = CGAffineTransformMakeScale(1.1, 1.1); //User defaults darkKeyboard.on = [[NSUserDefaults standardUserDefaults] boolForKey:@"darkKeyboard"]; UIView *keyboard = [[UIView alloc] initWithFrame:cell.frame]; keyboard.backgroundColor = [UIColor colorWithRed:0.176 green:0.176 blue:0.176 alpha:1]; cell.backgroundView = keyboard; 

didSelectRowAtIndexPath: Juste ajouté un NSLog, rien ne doit aller ici.

 - (void)updateSwitchAtIndexPath:(id)sender { if (darkKeyboard){ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; [userDefaults setBool:self.darkKeyboard.on forKey:@"darkKeyboard"]; [userDefaults synchronize]; if ([darkKeyboard isOn]) { [darkKeyboard setOn:YES animated:YES]; [self.tableView reloadData]; [[UIApplication sharedApplication] reloadInputViews]; } else { [darkKeyboard setOn:NO animated:YES]; [self.tableView reloadData]; [[UIApplication sharedApplication] reloadInputViews]; } } } 

J'espère que cela aide quelqu'un.

Réponse alternative

Donc, sans essayer de définir une autre couleur, simplement get une apparence claire ou sombre avec le commutateur qui a été mentionné. J'ai ajouté ceci à mon AppDelegate, (certaines personnes n'aiment pas append des trucs ici, mais avec autant de vues dans mon application c'est un must).

Ajoutez ceci ci-dessus l' @interface AppDelegate ()

 @interface UIWebBrowserView : UIView @end @implementation UIWebBrowserView (KeyboardSwitch) - (UIKeyboardAppearance) keyboardAppearance{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL switchOn = [userDefaults boolForKey:@"darkKeyboard"]; if (switchOn) { return UIKeyboardAppearanceDark; } else { return UIKeyboardAppearanceDefault; } } @end 

Fonctionne parfaitement. Probablement ne sera pas accepté par Apple, mais je n'ai aucun intérêt à cela.

Maintenant, pour les gens qui ne veulent pas créer une bascule et veulent juste le keyboard noir.

 @interface UIWebBrowserView : UIView @end @implementation UIWebBrowserView (KeyboardSwitch) - (UIKeyboardAppearance) keyboardAppearance{ return UIKeyboardAppearanceDark; } @end 

MISE À JOUR: Avec des colors personnalisées: Testé depuis iOS 7-8.2 en simulateur.

 - (UIKeyboardAppearance) keyboardAppearance{ NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults]; BOOL switchOn = [userDefaults boolForKey:@"darkKeyboard"]; if (switchOn) { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetContainerView")] || [possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIPeripheralHostView")]) { for (UIView* peripheralView in possibleFormView.subviews) { //Keyboard background for (UIView* peripheralView_sub in peripheralView.subviews) { //Setting custom color peripheralView_sub.backgroundColor = [UIColor colorWithRed:0.271 green:0.271 blue:0.271 alpha:0.50]; } } } } return UIKeyboardAppearanceDark; } else { UIWindow *keyboardWindow = nil; for (UIWindow *testWindow in [[UIApplication sharedApplication] windows]) { if (![[testWindow class] isEqual : [UIWindow class]]) { keyboardWindow = testWindow; break; } } for (UIView *possibleFormView in [keyboardWindow subviews]) { if ([possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIInputSetContainerView")] || [possibleFormView isKindOfClass:NSClassFromSsortingng(@"UIPeripheralHostView")]) { for (UIView* peripheralView in possibleFormView.subviews) { //Keyboard background for (UIView* peripheralView_sub in peripheralView.subviews) { //Clear color so it doesn't show when switching with toggle peripheralView_sub.backgroundColor = [UIColor clearColor]; } } } } return UIKeyboardAppearanceDefault; } } @end 

J'espère que cela aidera les futurs développeurs webview.