Chr*_*OSX 5 keyboard appearance webview ios
因此,从 UIWebView 中的这个线程UIKeyboardAppearance和TomSwift 的精彩答案改编代码,我得到了大约 99% 的工作。
在 iOS 7 模拟器中,一切似乎都运行良好。但是在 iOS 8 中,当键盘第一次出现时,< > 完成栏是白色的。当我点击或选择另一个输入时,它会更改为我指定的颜色。
我的问题是,我怎样才能防止和/或改变那个白色部分?
另一个线程中的所有代码都是相同的,除了我在 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];
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激。
因此,随着 iOS 9+ 的推出,我发现它破坏了上述方法。但是通过一些修补和查看一些观点,我想出了我在下面已经回答的内容的补充。
现在我决定放弃自定义颜色的东西,我只挖掘黑色键盘,适合我的应用程序。无论如何,这对我有用。在 9.1 sim 到 7 上测试。也在我的 6+ 上运行 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
Run Code Online (Sandbox Code Playgroud)
我真的希望有人发现这些答案有帮助:D
更新信息:对完成栏很好奇,这就是这一切的开始。我重新启用它只是为了查看,并发现它已将其更改为黑色。不错的奖励,虽然我已经放弃了它来隐藏带有滚动的键盘。
2015 年 12 月 19 日更新 所以我决定从 UIWebView 过渡到 WKWebView,结果却发现两者显然有所不同。我已经设法让它再次工作。常规的 UIKeyboardAppearanceDark 调用会导致键盘比我喜欢的更透明。所以我根据自己的喜好修改了它。同样,可能不是标准的做事方式,但我不在乎,反正它不会是苹果。
所有的东西仍然被放在 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:NSClassFromString(@"UIInputSetContainerView")] ||
[possibleFormView isKindOfClass:NSClassFromString(@"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:NSClassFromString(@"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:NSClassFromString(@"UIInputSetContainerView")] || [possibleFormView isKindOfClass:NSClassFromString(@"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:NSClassFromString(@"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
Run Code Online (Sandbox Code Playgroud)
我还没有像以前那样设法找到隐藏 inputAccessoryBar 的方法,但是多亏了几个线程,我才能让它工作。在我的视图控制器中,我调用:
-(void)removeInputAccessoryView {
UIView* subview;
for (UIView* view in webView.scrollView.subviews) {
if([[view.class description] hasPrefix:@"WKContent"])
subview = view;
}
if(subview == nil) return;
NSString* name = [NSString stringWithFormat:@"%@SwizzleHelper", subview.class.superclass];
Class newClass = NSClassFromString(name);
if(newClass == nil)
{
newClass = objc_allocateClassPair(subview.class, [name cStringUsingEncoding:NSASCIIStringEncoding], 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);
}
Run Code Online (Sandbox Code Playgroud)
在 viewDidLoad 中我调用:
[self removeInputAccessoryView];
Run Code Online (Sandbox Code Playgroud)
我计划再修修补补,但就目前而言,这适用于我需要它做的事情。
归档时间: |
|
查看次数: |
4974 次 |
最近记录: |