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

Can't detect orientation of device at launching app to create UIWebView with correct size

如果我启动我的应用程序,我想知道我的设备的方向。 在我的主 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 or iOS: Device orientation on load) 的帖子,但它并没有解决我的问题

编辑:

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

编辑 2:

问题已解决。我只添加了

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

而我的 UIWebView 总是和我的 UIView 一样大。在横向也是如此。 这里的答案()解决了我的问题。我是 Objective-C 的新手,但我在创建时将 UIWebView 的大小设置为与 UIView 相同的大小,这是否有意义?

您的整个 createWebView 方法是 ill-advised。你根本不应该关心方向。只需将您的网络视图添加到 self.view 并使用自动布局对其进行定位。这样,当布局完成时,无论方向或 self.view.

可能发生的任何其他情况,它都会处于正确的位置/大小

createWebView 方法中的大部分代码都不需要。最重要的是在添加网络视图之前设置 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];
}