美文网首页
强制横竖屏

强制横竖屏

作者: rachel_rui | 来源:发表于2018-04-09 15:28 被阅读0次

在进行 AR 页面横屏需求的开发的时候,遇到的问题。

AR 页面横屏的需求:

    整个浏览器框架都是竖屏的,但是 VR 页面需要横屏展示双眼模式,因此需要单独处理在 VR 页面的时候将控制器设置为可以横屏的。

开发思路:

    在- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;  方法里,拦截到 URL,然后使用下面这个方法来将URL中的参数解析出来:
- (NSMutableDictionary *)getURLParameters:(NSString *)urlStr {

    // 查找参数

    NSRange range = [urlStr rangeOfString:@"?"];
    if (range.location == NSNotFound) {
        return nil;
    }
    NSMutableDictionary *params = [NSMutableDictionary dictionary];
    NSString *parametersString = [urlStr substringFromIndex:range.location + 1];
    if ([parametersString containsString:@"&"]) {
        NSArray *urlComponents = [parametersString componentsSeparatedByString:@"&"];
        for (NSString *keyValuePair in urlComponents) {
            NSArray *pairComponents = [keyValuePair componentsSeparatedByString:@"="];
            NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding];
            NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding];
            if (key == nil || value == nil) {
                continue;
            }
            id existValue = [params valueForKey:key];
            if (existValue != nil) {
                if ([existValue isKindOfClass:[NSArray class]]) {
                    NSMutableArray *items = [NSMutableArray arrayWithArray:existValue];
                    [items addObject:value];
                    [params setValue:items forKey:key];
                } else {
                    [params setValue:@[existValue, value] forKey:key];
                }
            } else {
                [params setValue:value forKey:key];
            }
        }
    } else {
        NSArray *pairComponents = [parametersString componentsSeparatedByString:@"="];
        if (pairComponents.count == 1) {
            return nil;
        }
        NSString *key = [pairComponents.firstObject stringByRemovingPercentEncoding];
        NSString *value = [pairComponents.lastObject stringByRemovingPercentEncoding];
        if (key == nil || value == nil) {
            return nil;
        }
        [params setValue:value forKey:key];
    }
    return params;
}
然后在 - (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType; 方法中进行判断:
NSDictionary *paramDic = [self getURLParameters:requestURLString];
    if (paramDic && [paramDic[@"quanjing"] isEqualToString:@"true"]) {
        self.needAutorotate = YES;
    } else {
        self.needAutorotate = NO;
    }

之后重写横屏的两个方法:

- (BOOL)shouldAutorotate {
    return self.needAutorotate;
}

- (UIInterfaceOrientationMask)supportedInterfaceOrientations {
    if (self.needAutorotate) {
        return UIInterfaceOrientationMaskAllButUpsideDown;
    } else {
        return UIInterfaceOrientationMaskPortrait;
    }
}

以上,基本完成本需求的功能。

但是在自测是发现问题:当在 VR 页面处于横屏状态的时候,点击 VR 页面上的返回按钮,返回到的页面仍然是横屏的,这是不对的,返回到的页面应该是竖屏的。

打断点检查问题:

发现在点击 VR 页面上的返回按钮时,确实走进了self.needAutorotate = NO;

NSDictionary *paramDic = [self getURLParameters:requestURLString];
    if (paramDic && [paramDic[@"quanjing"] isEqualToString:@"true"]) {
        self.needAutorotate = YES;
    } else {
        self.needAutorotate = NO;
    }

于是查找到一个强制横屏的方法:

//强制横竖屏

- (void)interfaceOrientation:(UIInterfaceOrientation)orientation

{

    if ([[UIDevice currentDevice] respondsToSelector:@selector(setOrientation:)]) {

        SEL selector  = NSSelectorFromString(@"setOrientation:");

        NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:[UIDevice instanceMethodSignatureForSelector:selector]];

        [invocation setSelector:selector];

        [invocation setTarget:[UIDevice currentDevice]];

        int val = orientation;

        // 从2开始是因为0 1 两个参数已经被selector和target占用

        [invocation setArgument:&val atIndex:2];
        [invocation invoke];
    }

}

将下面代码改动一下:

NSDictionary *paramDic = [self getURLParameters:requestURLString];
    if (paramDic && [paramDic[@"quanjing"] isEqualToString:@"true"]) {
        self.needAutorotate = YES;
    } else {
        self.needAutorotate = NO;
        [self interfaceOrientation:UIInterfaceOrientationPortrait];
    }

最终解决了这个问题。

在后期优化调研时发现,上面强制横屏的操作,调用了苹果的私用方法,调用苹果私有方法有审核不过的风险。

相关文章

  • iOS 屏幕旋转控制

    /** 屏幕旋转控制 allowRotateType ==(0强制竖屏,1横竖屏,2~强制横屏 )*/ (UIIn...

  • 2021-10-21

    uni-app强制横竖屏 //强制横屏 plus.screen.lockOrientation('landscap...

  • 强制横竖屏显示,手动设置屏幕的显示方向,拦截navigation

    强制横竖屏设置横竖屏支持模式:1.项目配置:General -> Deployment Info -> Devic...

  • 强制横竖屏

    在进行 AR 页面横屏需求的开发的时候,遇到的问题。 AR 页面横屏的需求: 开发思路: 之后重写横屏的两个方法:...

  • 强制横竖屏

  • iOS 强制横竖屏

    最近在修改直播项目出现的问题,需要在直播页面强制进入横屏,记录下遇到的坑,稍后会写一篇阿里云直播的文章. 程序单独...

  • android 强制横竖屏

    强制竖屏设置 1.代码在Activity的onResume方法中添加如下代码 @Override protecte...

  • iOS 强制横竖屏

    强制横屏 强制竖屏 ⚠️ 在执行上述方法时要重写controller的一下方法

  • iOS 强制横/竖屏

    强制横竖屏 思路: 不同于自动旋转, 通过单利控制支持方向, 通过Device类强制让设备切换横竖方向 创建LFI...

  • iOS 切换横竖屏

    参照:iOS强制转换横竖屏和键盘方向控制 实现点击按钮切换横竖屏的功能,设备锁屏无影响。效果如图所示: 然后,就是...

网友评论

      本文标题:强制横竖屏

      本文链接:https://www.haomeiwen.com/subject/cosihftx.html