iOS 8 jquery mobile 1.4.4 клавиатура ввода больше не скрывает нижний колонтитул

iOS 8 jquery mobile 1.4 cordova 3.6.3 любой симулятор, любое физическое реальное устройство

проблема заключается в скрытии нижнего колонтитула, когда клавиатура появляется для ввода в поля формы

предыдущее решение работало довольно хорошо на iOS7 и теперь выглядит хорошо, когда вы нажимаете на элемент ввода, однако если вы прокручиваете форму, нижний колонтитул появляется (фиксируется на странице), перекрывая некоторые другие поля ввода.

1 ответ

Решение

Решение найдено!

IOS

необходимо отредактировать CDVNotification.m и CDVNotification.h в папке src плагина org.apache.cordova.dialogs, как описано здесь: добавить свойства и методы в CDVnotification

Так как было не ясно, куда помещать новые строки, это новый код в CDVnotification.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import <AudioToolbox/AudioServices.h>
#import <Cordova/CDVPlugin.h>

@interface CDVNotification : CDVPlugin <UIAlertViewDelegate>{}

@property (strong) NSString* keyboardShowcallbackId;
@property (strong) NSString* keyboardHidecallbackId;

- (void)alert:(CDVInvokedUrlCommand*)command;
- (void)confirm:(CDVInvokedUrlCommand*)command;
- (void)prompt:(CDVInvokedUrlCommand*)command;
- (void)beep:(CDVInvokedUrlCommand*)command;

- (void)keyboardShow:(CDVInvokedUrlCommand*)command;
- (void)keyboardHide:(CDVInvokedUrlCommand*)command;

@end

@interface CDVAlertView : UIAlertView {}
@property (nonatomic, copy) NSString* callbackId;

@end

тогда вот где я вставил новые строки в CDVNotification.m

- (void)beep:(CDVInvokedUrlCommand*)command
{
    NSNumber* count = [command.arguments objectAtIndex:0 withDefault:[NSNumber numberWithInt:1]];
    playBeep([count intValue]);
}

//Keyboard notifications.

- (void)keyboardShow:(CDVInvokedUrlCommand*)command {

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];

    self.keyboardShowcallbackId = command.callbackId;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardShowCallback:)
                                                 name:UIKeyboardWillShowNotification object:nil];
}
- (void)keyboardHide:(CDVInvokedUrlCommand*)command {
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];

    self.keyboardHidecallbackId = command.callbackId;
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyBoardHideCallback:)
                                                 name:UIKeyboardWillHideNotification object:nil];
}

- (void)keyBoardHideCallback:(NSNotification*)notification {
    if (self.keyboardHidecallbackId) {
        CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];
        [result setKeepCallbackAsBool:YES];

        [self.commandDelegate sendPluginResult:result callbackId:self.keyboardHidecallbackId];
    }
}

- (void)keyBoardShowCallback:(NSNotification*)notification  {
    if (self.keyboardShowcallbackId) {
        CDVPluginResult* result = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK];

        [result setKeepCallbackAsBool:YES];
        [self.commandDelegate sendPluginResult:result callbackId:self.keyboardShowcallbackId];
    }
}

@end

@implementation CDVAlertView

@synthesize callbackId;

@end

затем найдите в вашем приложении cordova/phonegap событие ondeviceready и вставьте две строки cordova.exec.

onDeviceReady: function() {
    app.receivedEvent('deviceready');

    navigator.splashscreen.hide();

}, // fine onDeviceReady

receivedEvent: function(id) {

   console.log('Received Event: ' + id);

    if (isMobile.iOS()) {

        alert("this is iOS"); //

        cordova.exec(function(){  $("#footer").hide();  },function(){console.log("error");},"Notification","keyboardShow",[]);

        cordova.exec(function(){  $("#footer").show();  },function(){console.log("error");},"Notification","keyboardHide",[]);

    } else { 

        alert("this is android"); 

        document.addEventListener("showkeyboard", function(){ $("#footer").hide(); }, false);
        document.addEventListener("hidekeyboard", function(){ $("#footer").show(); }, false);


    }



}

Android

предыдущее решение, js-код вставки, который определяет изменение размера окна при появлении виртуальной клавиатуры css, все еще работает в Android

<script type="text/javascript">
document.write( '<style>#footer{visibility:hidden}@media(min-height:' + ($( window ).height() - 10) + 'px){#footer{visibility:visible}}</style>' );
</script> 

Однако я выбрал

document.addEventListener("showkeyboard", function(){ $("#footer").hide(); }, false);
document.addEventListener("hidekeyboard", function(){ $("#footer").show(); }, false);

если устройство Android.

Надеюсь, это поможет кому-то вроде меня бороться с этим с одного месяца:)!!

Другие вопросы по тегам