This repository has been archived by the owner. It is now read-only.
Permalink
Fetching contributors…
Cannot retrieve contributors at this time
177 lines (139 sloc) 5.71 KB
#import "IonicKeyboard.h"
// #import "UIWebViewExtension.h"
#import <Cordova/CDVAvailability.h>
@implementation IonicKeyboard
@synthesize hideKeyboardAccessoryBar = _hideKeyboardAccessoryBar;
@synthesize disableScroll = _disableScroll;
//@synthesize styleDark = _styleDark;
- (void)pluginInitialize {
Class wkClass = NSClassFromString([@[@"UI", @"Web", @"Browser", @"View"] componentsJoinedByString:@""]);
wkMethod = class_getInstanceMethod(wkClass, @selector(inputAccessoryView));
wkOriginalImp = method_getImplementation(wkMethod);
Class uiClass = NSClassFromString([@[@"WK", @"Content", @"View"] componentsJoinedByString:@""]);
uiMethod = class_getInstanceMethod(uiClass, @selector(inputAccessoryView));
uiOriginalImp = method_getImplementation(uiMethod);
nilImp = imp_implementationWithBlock(^(id _s) {
return nil;
});
//set defaults
self.hideKeyboardAccessoryBar = YES;
self.disableScroll = NO;
//self.styleDark = NO;
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
__weak IonicKeyboard* weakSelf = self;
_keyboardShowObserver = [nc addObserverForName:UIKeyboardWillShowNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification* notification) {
CGRect keyboardFrame = [notification.userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrame = [self.viewController.view convertRect:keyboardFrame fromView:nil];
[weakSelf.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.plugins.Keyboard.isVisible = true; cordova.fireWindowEvent('native.keyboardshow', { 'keyboardHeight': %@ }); ", [@(keyboardFrame.size.height) stringValue]]];
//deprecated
[weakSelf.commandDelegate evalJs:[NSString stringWithFormat:@"cordova.fireWindowEvent('native.showkeyboard', { 'keyboardHeight': %@ }); ", [@(keyboardFrame.size.height) stringValue]]];
}];
_keyboardHideObserver = [nc addObserverForName:UIKeyboardWillHideNotification
object:nil
queue:[NSOperationQueue mainQueue]
usingBlock:^(NSNotification* notification) {
[weakSelf.commandDelegate evalJs:@"cordova.plugins.Keyboard.isVisible = false; cordova.fireWindowEvent('native.keyboardhide'); "];
//deprecated
[weakSelf.commandDelegate evalJs:@"cordova.fireWindowEvent('native.hidekeyboard'); "];
}];
}
- (BOOL)disableScroll {
return _disableScroll;
}
- (void)setDisableScroll:(BOOL)disableScroll {
if (disableScroll == _disableScroll) {
return;
}
if (disableScroll) {
self.webView.scrollView.scrollEnabled = NO;
self.webView.scrollView.delegate = self;
}
else {
self.webView.scrollView.scrollEnabled = YES;
self.webView.scrollView.delegate = nil;
}
_disableScroll = disableScroll;
}
//keyboard swizzling inspired by:
//https://github.com/cjpearson/cordova-plugin-keyboard/
- (BOOL)hideKeyboardAccessoryBar {
return _hideKeyboardAccessoryBar;
}
- (void)setHideKeyboardAccessoryBar:(BOOL)hideKeyboardAccessoryBar {
if (hideKeyboardAccessoryBar == _hideKeyboardAccessoryBar) {
return;
}
if (hideKeyboardAccessoryBar) {
method_setImplementation(wkMethod, nilImp);
method_setImplementation(uiMethod, nilImp);
} else {
method_setImplementation(wkMethod, wkOriginalImp);
method_setImplementation(uiMethod, uiOriginalImp);
}
_hideKeyboardAccessoryBar = hideKeyboardAccessoryBar;
}
/*
- (BOOL)styleDark {
return _styleDark;
}
- (void)setStyleDark:(BOOL)styleDark {
if (styleDark == _styleDark) {
return;
}
if (styleDark) {
self.webView.styleDark = YES;
}
else {
self.webView.styleDark = NO;
}
_styleDark = styleDark;
}
*/
/* ------------------------------------------------------------- */
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[scrollView setContentOffset: CGPointZero];
}
/* ------------------------------------------------------------- */
- (void)dealloc {
NSNotificationCenter* nc = [NSNotificationCenter defaultCenter];
[nc removeObserver:self name:UIKeyboardWillShowNotification object:nil];
[nc removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
/* ------------------------------------------------------------- */
- (void) disableScroll:(CDVInvokedUrlCommand*)command {
if (!command.arguments || ![command.arguments count]){
return;
}
id value = [command.arguments objectAtIndex:0];
if (value != [NSNull null]) {
self.disableScroll = [value boolValue];
}
}
- (void) hideKeyboardAccessoryBar:(CDVInvokedUrlCommand*)command {
if (!command.arguments || ![command.arguments count]){
return;
}
id value = [command.arguments objectAtIndex:0];
if (value != [NSNull null]) {
self.hideKeyboardAccessoryBar = [value boolValue];
}
}
- (void) close:(CDVInvokedUrlCommand*)command {
[self.webView endEditing:YES];
}
- (void) show:(CDVInvokedUrlCommand*)command {
NSLog(@"Showing keyboard not supported in iOS due to platform limitations.");
}
/*
- (void) styleDark:(CDVInvokedUrlCommand*)command {
if (!command.arguments || ![command.arguments count]){
return;
}
id value = [command.arguments objectAtIndex:0];
self.styleDark = [value boolValue];
}
*/
@end