PhoneGap 兼容IOS上移20px

引自:http://stackoverflow.com/questions/19209781/ios-7-status-bar-with-phonegap

情景:在ios7下PhoneGap app会上移20px从而被状态栏挡住,查找了些方法后可以解决这问题,但是拍照完返回界面后仍然会出现上移20px的情况,参考了链接后,最终解决方法如下:

in  AppDelegate.m  //兼容启动页上移20px

- (BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions
{
    CGRect screenBounds = [[UIScreen mainScreen] bounds];

#if __has_feature(objc_arc)
        self.window = [[UIWindow alloc] initWithFrame:screenBounds];
#else
        self.window = [[[UIWindow alloc] initWithFrame:screenBounds] autorelease];
#endif
    self.window.autoresizesSubviews = YES;

#if __has_feature(objc_arc)
        self.viewController = [[MainViewController alloc] init];
#else
        self.viewController = [[[MainViewController alloc] init] autorelease];
#endif
    self.viewController.useSplashScreen = YES;

    // Set your app‘s start page by setting the <content src=‘foo.html‘ /> tag in config.xml.
    // If necessary, uncomment the line below to override it.
    // self.viewController.startPage = @"index.html";

    // NOTE: To customize the view‘s frame size (which defaults to full screen), override
    // [self.viewController viewWillAppear:] in your view controller.

    self.window.rootViewController = self.viewController;
    [self.window makeKeyAndVisible];
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7)
    {
        [application setStatusBarStyle:UIStatusBarStyleLightContent];
        self.window.clipsToBounds = YES;
        self.window.frame = CGRectMake(0, 20, self.window.frame.size.width, self.window.frame.size.height-20);
    }

    return YES;
}

In MainViewController.h:

@interface MainViewController : CDVViewController
@property (atomic) BOOL viewSizeChanged;
@end

In 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 ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7) {
        CGRect viewBounds = [self.webView bounds];
        if (viewBounds.origin.y == 0 && self.viewSizeChanged) {
            viewBounds.origin.y = 20;
            viewBounds.size.height = viewBounds.size.height - 20;
        }
        self.webView.frame = viewBounds;
        self.viewSizeChanged = YES;
    }
    [super viewWillAppear:animated];
}

Now for the viewport problem, in your deviceready event listener, add this (using jQuery):

 1 if (window.device && parseFloat(window.device.version) >= 7) {
 2   $(window).on(‘orientationchange‘, function () {
 3       var orientation = parseInt(window.orientation, 10);
 4       // We now the width of the device is 320px for all iphones
 5       // Default height for landscape (remove the 20px statusbar)
 6       var height = 300;
 7       // Default width for portrait
 8       var width = 320;
 9       if (orientation !== -90 && orientation !== 90 ) {
10         // Portrait height is that of the document minus the 20px of
11         // the statusbar
12         height = document.documentElement.clientHeight - 20;
13       } else {
14         // This one I found experimenting. It seems the clientHeight
15         // property is wrongly set (or I misunderstood how it was
16         // supposed to work).
17         // Dunno if it‘s specific to my setup.
18         width = document.documentElement.clientHeight + 20;
19       }
20       document.querySelector(‘meta[name=viewport]‘)
21         .setAttribute(‘content‘,
22           ‘width=‘ + width + ‘,‘ +
23           ‘height=‘ + height + ‘,‘ +
24           ‘initial-scale=1.0,maximum-scale=1.0,user-scalable=no‘);
25     })
26     .trigger(‘orientationchange‘);
27 }

Here is the viewport I use for other versions:

1 <meta name="viewport" content="width=device-width,user-scalable=no,initial-scale=1.0,maximum-scale=1.0" />

测试结果:完美解决。

时间: 2024-10-15 01:58:31

PhoneGap 兼容IOS上移20px的相关文章

Phonegap 之 iOS银联在线支付(js调用ios端银联支付控件)

Phonegap项目,做支付的时候,当把网站打包到ios或android端成app后,在app上通过wap调用银联在线存在一个问题: 就是当从银联支付成功后,再从服务器返回到app客户端就很难实现. wap银联支付流程是这样:客户端---> 服务器(构建支付请求)--> 银联支付 ---> 返回到服务端(处理支付结果).所以对于手机网站银联支付没有问题,但是对于ios端app和android端app, 再通过wap支付,发现支付成功后,很难在回到app客户端了. 所以这里就必须借助Pho

配置PhoneGap 到iOS

下载 phonegap安装phonegap之前需要NodeJS环境,下载NodeJS并安装.安装环境的目的是为了使用phonegap命令行. 3. 安装phonegap使用命令    $phonegap create my-app    $cd my-app     $phonegap run iOS这样就会自动创建ios环境,可以在目录my-app/platforms/中找到ios目录.这样系统就自动为我们创建了一个ios的phonegap项目.此项目在默认目录中.4. 自定义项目创建路径命令

兼容iOS 10 资料整理笔记-b

原文链接:http://www.jianshu.com/p/0cc7aad638d9 1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.

PhoneGap For iOS开发&amp;测试环境搭建

1.创建目录 cd 进入 2.phonegap create hello "com.zph.hello" "helloWorld"   //创建工程 3.cd hello;phonegap build ios //为phonegap添加ios平台支持 4.appDelegate文件中 打开self.viewController.startPage = @"index.html";

兼容iOS 10 资料整理笔记

1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.应用在前台时,是无法直接显示远程通知,还需要进一步处理. 4.已经发出的通知是不能更新

利用React Native 从0到1 开发一款兼容IOS和android的APP(仿造京东)

最近有一部电视剧叫做<微微一笑很傻逼>里面有个男猪脚,人们都叫他大神~我觉得吧~大神是相对的~所以~啥事都得谦虚! 好了 今天介绍的是如何从0到1利用React Native开发一款兼容IOS和android的仿造京东的APP,是不是很激动?我保证我说的很通俗易懂,当然,大神请滚蛋,这个不适合你看 ok!扯犊子结束,下面开始! 第一步:打开你的手机JD客户端--我们来分析一下 看到了不~在上面的图就是JD客户端的分析图(ok,我承认这图是盗的),从上面的图我们可知道JDAPP的一个页面的主要结

【转】兼容iOS 10 资料整理

1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.应用在前台时,是无法直接显示远程通知,还需要进一步处理. 4.已经发出的通知是不能更新

兼容iOS 10 资料整理

1.Notification(通知) 自从Notification被引入之后,苹果就不断的更新优化,但这些更新优化只是小打小闹,直至现在iOS 10开始真正的进行大改重构,这让开发者也体会到UserNotifications的易用,功能也变得非常强大. iOS 9 以前的通知 1.在调用方法时,有些方法让人很难区分,容易写错方法,这让开发者有时候很苦恼. 2.应用在运行时和非运行时捕获通知的路径还不一致. 3.应用在前台时,是无法直接显示远程通知,还需要进一步处理. 4.已经发出的通知是不能更新

背景音乐的自动播放(兼容 ios 和 android)

ios 为了节省用户流量,对于 audio 和 video标签的 preload 和 autopaly 标签 会自动拦截, 除非用户手动点击 交互才会执行 . 但是对于背景音乐,又必须加载的时候就要执行,怎么办,直接调用js 来自动触发. <audio id="bgaudio" src="./media/bg-music.mp3" loop="loop"></audio> <script type="tex