回答https://stackoverflow.com/a/19249775/1502287はうまくいきましたが、カメラプラグイン(および潜在的に他のプラグイン)と「height = device-」のビューポートメタタグで機能するように少し変更する必要がありました高さ」(高さの部分を設定しないと、私の場合、キーボードがビューの上に表示され、途中でいくつかの入力が隠されます)。
カメラ ビューを開いてアプリに戻るたびに、viewWillAppear メソッドが呼び出され、ビューが 20 ピクセル縮小されます。
また、ビューポートのデバイスの高さには 20 ピクセルが追加され、コンテンツがスクロール可能になり、Web ビューよりも 20 ピクセル高くなります。
カメラの問題の完全な解決策は次のとおりです。
MainViewController.h で:
@interface MainViewController : CDVViewController
@property (atomic) BOOL viewSizeChanged;
@end
MainViewController.m で:
@implementation MainViewController
@synthesize viewSizeChanged;
[...]
- (id)init
{
self = [super init];
if (self) {
// On init, size has not yet been changed
self.viewSizeChanged = NO;
// Uncomment to override the CDVCommandDelegateImpl used
// _commandDelegate = [[MainCommandDelegate alloc] initWithViewController:self];
// Uncomment to override the CDVCommandQueue used
// _commandQueue = [[MainCommandQueue alloc] initWithViewController:self];
}
return self;
}
[...]
- (void)viewWillAppear:(BOOL)animated
{
// View defaults to full size. If you want to customize the view's size, or its subviews (e.g. webView),
// you can do so here.
// Lower screen 20px on ios 7 if not already done
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7 && !self.viewSizeChanged) {
CGRect viewBounds = [self.webView bounds];
viewBounds.origin.y = 20;
viewBounds.size.height = viewBounds.size.height - 20;
self.webView.frame = viewBounds;
self.viewSizeChanged = YES;
}
[super viewWillAppear:animated];
}
ビューポートの問題については、deviceready イベント リスナーで、これを (jQuery を使用して) 追加します。
if (window.device && parseFloat(window.device.version) >= 7) {
$(window).on('orientationchange', function () {
var orientation = parseInt(window.orientation, 10);
// We now the width of the device is 320px for all iphones
// Default height for landscape (remove the 20px statusbar)
var height = 300;
// Default width for portrait
var width = 320;
if (orientation !== -90 && orientation !== 90 ) {
// Portrait height is that of the document minus the 20px of
// the statusbar
height = document.documentElement.clientHeight - 20;
} else {
// This one I found experimenting. It seems the clientHeight
// property is wrongly set (or I misunderstood how it was
// supposed to work).
// I don't know if it is specific to my setup.
width = document.documentElement.clientHeight + 20;
}
document.querySelector('meta[name=viewport]')
.setAttribute('content',
'width=' + width + ',' +
'height=' + height + ',' +
'initial-scale=1.0,maximum-scale=1.0,user-scalable=no');
})
.trigger('orientationchange');
}
他のバージョンで使用するビューポートは次のとおりです。
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0" />
そして、すべてがうまく機能するようになりました。