在启动应用程序时无法检测设备的方向以创建具有正确大小的 UIWebView

Posted

技术标签:

【中文标题】在启动应用程序时无法检测设备的方向以创建具有正确大小的 UIWebView【英文标题】:Can't detect orientation of device at launching app to create UIWebView with correct size 【发布时间】:2016-01-21 16:45:50 【问题描述】:

如果我启动我的应用程序,我想知道我的设备的方向。 在我的主要view controller 中,我有一个UIWebView,我以编程方式将其添加到主要view controller

我使用(int)[[UIApplication sharedApplication] statusBarOrientation] 对其进行了测试,但我只得到了数字 1。无论我的设备是纵向还是横向。

我想设置我的UIWebView 的大小,但如果我不知道方向如何设置它的大小?

2016-01-21 17:21:45.387 iPhoneApp[1026:151720] 0) Orientation: 1
2016-01-21 17:21:45.388 iPhoneApp[1026:151720] 0) Orientation: 0
2016-01-21 17:21:45.393 iPhoneApp[1026:151720] 1) Orientation: 1
2016-01-21 17:21:45.393 iPhoneApp[1026:151720] 1) Orientation: 0
2016-01-21 17:21:45.406 iPhoneApp[1026:151720] 2) Orientation: 1
2016-01-21 17:21:45.406 iPhoneApp[1026:151720] 2) Orientation: 1
2016-01-21 17:21:45.417 iPhoneApp[1026:151720] 3) Orientation: 1
2016-01-21 17:21:45.417 iPhoneApp[1026:151720] 3) Orientation: 1

0 在didFinishLaunchingWithOptions

1 在viewDidLoad

2 在viewDidAppear

3 在我创建UIWebView的方法中

NSLog(@"3) Orientation: %d", (int)[[UIApplication sharedApplication] statusBarOrientation]);
NSLog(@"3) Orientation: %d", (int)[[UIDevice currentDevice] orientation]);

这始终是我的日志顺序。

我创建UIWebView 的方法看起来像

-(void)createWebView 
    //NSLog(@"createWebView");
    //NSLog(@"orientation: %d", [[self orientNr] intValue]);
    [self destroyWebView];
    NSLog(@"3) Orientation: %d", (int)[[UIApplication sharedApplication] statusBarOrientation]);
    NSLog(@"3) Orientation: %d", (int)[[UIDevice currentDevice] orientation]);
    if( ([self firstLoad] && [[self orientNr] isEqualToNumber:[[NSNumber alloc] initWithInt:2]]) ||
        ([self firstLoad] && [[self orientNr] isEqualToNumber:[[NSNumber alloc] initWithInt:1]] && UIInterfaceOrientationIsLandscape([[UIApplication sharedApplication] statusBarOrientation])))
        [self setWebView:[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.height, self.view.frame.size.width)]];
    else
        [self setWebView:[[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height)]];
    dispatch_async(dispatch_get_main_queue(), ^
        [[self view] addSubview:[self webView]];
    );
    [[self webView] setScalesPageToFit:YES];
    [[self webView] setDelegate:self];
    [[self webView] setAutoresizingMask:UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight];
    [[self view] setAutoresizesSubviews:YES];
    //NSLog(@"iPhoneApp: %@", [self webView]);

变量firstLoad 检查应用程序是否已启动。 orientNr 是将应用程序旋转到我想要的给定方向的数字,对于解决方案并不重要(1 是设备,2 是横向)。 webView 的类型为 UIWebView

因此,如果我以纵向启动应用程序和设备,我想创建宽度为 320 和高度为 568 的 webView。如果它是在横向启动时,我想创建宽度为 568 和高度为 320 的 webView

我的问题是在启动时检测设备的方向。我还搜索并找到了一些线程,例如(Get launch orientation of iPad app 或 ios: Device orientation on load),但它并没有解决我的问题

编辑:

只有当我的设备处于横向模式或UIWebView 应该在启动应用程序时以横向模式启动时才会发生这种情况

编辑 2:

问题解决了。我只加了

-(void)viewDidLayoutSubviews 
    [super viewDidLayoutSubviews];
    [[self webView] setFrame:[[self view] bounds]];

我的UIWebView 的大小始终与我的UIView 相同。在横向也是。 这里的答案(https://***.com/a/24398249/5629933)解决了我的问题。我是 Objective-C 的新手,但尽管我在创建 UIWebView 时将其大小设置为与 UIView 相同,但这样做有意义吗?

【问题讨论】:

您正在做的某些事情太早了,这就是为什么您会得到无用的结果。但是您根本不需要知道设备的方向。使用自动布局定位您的 Web 视图。这样,无论发生什么,它都会处于正确的位置。 嗯,我明白了,但是尺寸设置不正确。如果您可以在我的方法中看到我创建web view 的位置,那么它的大小始终是 320 宽和 568 高。想象一下,如果此视图的方向设置为横向,我的 web view 方向正确,但尺寸不适合整个屏幕。如果我的设备处于横向模式,同样的问题只是我的网站大小不适合整个屏幕,因为我的 UIView 的宽度始终是 320 宽度和 568 高度 @matt。我该如何解决? 那张截图毫无意义。其中哪一部分是self.view?其中哪一部分应该是网络视图?页面加载到 Web 视图中的部分是什么? @rmaddy 我添加了另一个屏幕截图。我的web view 在左侧,内容(句子)。它应该填满整个屏幕截图,而不仅仅是一半 那个屏幕截图更糟糕。它只是白色的。您如何判断 Web 视图是否真的填满了 self.view?设置self.view.backgroundColor = [UIColor greenColor];。运行您的应用程序。你看到绿色了吗?如果不是,则 Web 视图正在填充 self.view 【参考方案1】:

您的createWebView 方法中的大部分代码都不需要。最重要的是在添加 web 视图之前设置autoresizingMask

-(void)createWebView 
    //NSLog(@"createWebView");
    self.webView = [[UIWebView alloc] initWithFrame:self.view.bounds];
    self.webView.scalesPageToFit = YES;
    self.webView.delegate = self;
    self.webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    [self.view addSubview:self.webView];

【讨论】:

我也是这么想的,但是如果网站在我启动应用程序时配置为横向,它不适合我的整个屏幕。它只有 320 宽和 568 高的尺寸。该网站的方向正确,但我的web view 的大小不正确。它只有景观的一半大小@rmaddy 我很困惑。您的问题是网络视图的大小没有填满self.view,还是加载的网站没有正确地填满网络视图? 我的问题是我的web view 没有填满我的self.view 我的所有应用程序都严格使用代码,就像我在答案中发布的那样。无论self.view 的大小如何变化,这样的代码都应确保Web 视图将填充self.view。你怎么知道网络视图没有填满self.view 我编辑了我的帖子。它看起来像这个图像。采纳了不是问题,为什么不是全屏?【参考方案2】:

您的整个createWebView 方法是不明智的。你根本不应该关心方向。只需将您的 web 视图添加到 self.view 并使用自动布局定位它。这样,当布局完成时,无论方向或 self.view 可能发生的任何其他事情,它都会处于正确的位置/大小。

【讨论】:

以上是关于在启动应用程序时无法检测设备的方向以创建具有正确大小的 UIWebView的主要内容,如果未能解决你的问题,请参考以下文章

在 iPad 上启动应用程序时没有获得正确的方向

当项目具有动态高度时,如何根据设备方向创建动态颤动网格布局

更改方向时正确查看绘图,但在第一次显示时失败

当设备以横向启动时,UIDevice 方向返回纵向

以正确方向以编程方式显示 UIView 的最佳实践

支持iPhone 6和iPhone 6+,具有不同的启动/启动屏幕图像,适用于iPad纵向和横向方向