summaryrefslogtreecommitdiff
path: root/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m')
-rw-r--r--plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m109
1 files changed, 109 insertions, 0 deletions
diff --git a/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m b/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m
new file mode 100644
index 00000000..25403e6f
--- /dev/null
+++ b/plugins/com.ionic.keyboard/src/ios/UIWebViewExtension.m
@@ -0,0 +1,109 @@
+#import <objc/runtime.h>
+#import <UIKit/UIKit.h>
+#import "UIWebViewExtension.h"
+
+//Credit: https://gist.github.com/bjhomer/2048571
+//Also: http://stackoverflow.com/a/23398487/1091751
+@implementation UIWebView (HackishAccessoryHiding)
+
+static const char * const hackishFixClassName = "UIWebBrowserViewMinusAccessoryView";
+static Class hackishFixClass = Nil;
+
+- (UIView *)hackishlyFoundBrowserView {
+ UIScrollView *scrollView = self.scrollView;
+
+ UIView *browserView = nil;
+ for (UIView *subview in scrollView.subviews) {
+ if ([NSStringFromClass([subview class]) hasPrefix:@"UIWebBrowserView"]) {
+ browserView = subview;
+ break;
+ }
+ }
+ return browserView;
+}
+
+- (id)methodReturningNil {
+ return nil;
+}
+
+- (void)ensureHackishSubclassExistsOfBrowserViewClass:(Class)browserViewClass {
+ if (!hackishFixClass) {
+ Class newClass = objc_allocateClassPair(browserViewClass, hackishFixClassName, 0);
+ IMP nilImp = [self methodForSelector:@selector(methodReturningNil)];
+ class_addMethod(newClass, @selector(inputAccessoryView), nilImp, "@@:");
+ objc_registerClassPair(newClass);
+
+ hackishFixClass = newClass;
+ }
+}
+
+- (BOOL) hackishlyHidesInputAccessoryView {
+ UIView *browserView = [self hackishlyFoundBrowserView];
+ return [browserView class] == hackishFixClass;
+}
+
+- (void) setHackishlyHidesInputAccessoryView:(BOOL)value {
+ UIView *browserView = [self hackishlyFoundBrowserView];
+ if (browserView == nil) {
+ return;
+ }
+ [self ensureHackishSubclassExistsOfBrowserViewClass:[browserView class]];
+
+ if (value) {
+ object_setClass(browserView, hackishFixClass);
+ }
+ else {
+ Class normalClass = objc_getClass("UIWebBrowserView");
+ object_setClass(browserView, normalClass);
+ }
+ [browserView reloadInputViews];
+}
+/* ---------------------------------------------------------------- */
+
+/*
+- (UIKeyboardAppearance) darkKeyboardAppearanceTemplateMethod {
+ return UIKeyboardAppearanceDark;
+}
+
+- (UIKeyboardAppearance) lightKeyboardAppearanceTemplateMethod {
+ return UIKeyboardAppearanceLight;
+}
+
+- (BOOL) styleDark {
+ UIView *browserView = [self hackishlyFoundBrowserView];
+ if (browserView == nil) {
+ return false;
+ }
+
+ Method m = class_getInstanceMethod( [self class], @selector( darkKeyboardAppearanceTemplateMethod ) );
+ IMP imp = method_getImplementation( m );
+
+ Method m2 = class_getInstanceMethod( [browserView class], @selector(keyboardAppearance) );
+ IMP imp2 = method_getImplementation( m2 );
+
+ return imp == imp2;
+}
+
+- (void) setStyleDark:(BOOL)styleDark {
+ UIView *browserView = [self hackishlyFoundBrowserView];
+ if (browserView == nil) {
+ return;
+ }
+
+ if ( styleDark ) {
+ Method m = class_getInstanceMethod( [self class], @selector( darkKeyboardAppearanceTemplateMethod ) );
+ IMP imp = method_getImplementation( m );
+ const char* typeEncoding = method_getTypeEncoding( m );
+ class_replaceMethod( [browserView class], @selector(keyboardAppearance), imp, typeEncoding );
+ }
+ else {
+ Method m = class_getInstanceMethod( [self class], @selector( lightKeyboardAppearanceTemplateMethod ) );
+ IMP imp = method_getImplementation( m );
+ const char* typeEncoding = method_getTypeEncoding( m );
+ class_replaceMethod( [browserView class], @selector(keyboardAppearance), imp, typeEncoding );
+ }
+}
+*/
+
+@end
+