Câu trả lời https://stackoverflow.com/a/19249775/1502287 phù hợp với tôi, nhưng tôi phải thay đổi một chút để làm cho nó hoạt động với plugin camera (và có thể là các plugin khác) và thẻ meta viewport với "height = device- height "(không đặt phần chiều cao sẽ khiến bàn phím xuất hiện trên chế độ xem trong trường hợp của tôi, ẩn một số đầu vào trên đường đi).
Mỗi lần bạn mở chế độ xem camera và quay lại ứng dụng của mình, phương thức viewWillAppear sẽ được gọi và chế độ xem của bạn sẽ thu nhỏ 20px.
Ngoài ra, chiều cao thiết bị cho chế độ xem sẽ bao gồm thêm 20 px, hiển thị nội dung có thể cuộn và cao hơn 20px so với webview.
Đây là giải pháp hoàn chỉnh cho vấn đề máy ảnh:
Trong MainViewController.h:
@interface MainViewController : CDVViewController
@property (atomic) BOOL viewSizeChanged;
@end
Trong 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];
}
Bây giờ đối với vấn đề về khung nhìn, trong trình nghe sự kiện đã thiết bị của bạn, hãy thêm điều này (sử dụng 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).
// Dunno if it's 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');
}
Đây là khung nhìn tôi sử dụng cho các phiên bản khác:
<meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0" />
Và tất cả đều hoạt động tốt.