iOS 6及以上控制个别视图旋转案例

iOS视图旋转控制
本文介绍如何在iOS应用中仅让特定视图控制器支持旋转,通过在UITabBarController中实现shouldAutorotate和supportedInterfaceOrientations方法来控制不同视图控制器的旋转行为。

      有这样一个需求:项目的根视图控制器是UITabBarController,有几个tab对应的都是UINavigationController,其中某个UINavigationController的栈中分别有控制器a和控制器b(由控制器a push 进入 控制器b),要求只有控制器b支持旋转。该怎么做呢?大家都知道,在iOS 6及以后,要控制视图的旋转需要在最顶端的控制器中添加下面两个回调方法

// 能否自动旋转
- (BOOL)shouldAutorotate;

// 如果能够旋转,返回支持的旋转方向
- (NSInteger)supportedInterfaceOrientations;
不同于iOS 6之前只需要在相应的视图控制器中添加下面的回调方法

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation;
因为项目只要支持iOS 6及以上,所以不需要额外在每个视图控制器中做旋转定制以支持iOS 6以前的系统。那么解决思路就很清晰了,只要在我的最顶层的根视图控制器中,也就是UITabBarController中进行一些判断,如果当前的界面是控制器b的view,那么在shouldAutorotate和supportedInterfaceOrientations中分别返回YES和支持的旋转方向,其余情况一律返回NO和UIInterfaceOrientationMaskPortrait。

下面我们来进行具体操作,首先按需要搭建一个测试工程,工程结构如下图所示


其中,FirstDetailViewController代表的就是需求中的控制b,它是支持除home键在上方向的所有方向。FirstViewController代表控制器a。最方便的解决方法就是添加一个UITabBarController的类别,在类别中添加如下代码

#pragma mark - rotation
- (BOOL)shouldAutorotate
{
    UINavigationController *nav = (UINavigationController *)self.selectedViewController;
    if ([nav isEqual:[self.viewControllers objectAtIndex:0]]) {
        UIViewController *vc = [nav topViewController];
        if ([vc isKindOfClass:[FirstDetailViewController class]]) {
            return YES;
        }
    }
    return NO;
}

- (NSInteger)supportedInterfaceOrientations
{
    UINavigationController *nav = (UINavigationController *)self.selectedViewController;
    if ([nav isEqual:[self.viewControllers objectAtIndex:0]]) {
        UIViewController *vc = [nav topViewController];
        if ([vc isKindOfClass:[FirstDetailViewController class]]) {
            return UIInterfaceOrientationMaskAllButUpsideDown;
        }
    }
    return UIInterfaceOrientationMaskPortrait;
}
到这里为止,已经是完成了这个需求。但是这种解决方法并不能应付所有的情况,因为当FirstDetailViewController 在非竖屏的情况下pop的时候,你会发现FirstViewController的旋转方向并没有立马旋转回Portrait方向,而是跟FirstDetailViewController保持一致。索性项目中在FirstDetailViewController pop之前,FirstDetailViewController一定会先返回到Portrait方向,所以就不存在任何问题。跟我的项目相似情况的如优酷手机客户端(视频播放界面代表了视图控制器a),具体亲们可以下载过来看看。

内容概要:本文详细介绍了一个基于Java后端与Vue前端的可解释性黑盒模型解释与可视化系统的设计与实现。系统旨在解决人工智能模型“黑箱”问题,通过集成LIME、SHAP、特征重要性评估等主流可解释性算法,实现对复杂模型决策过程的透明化分析。项目采用Spring Boot构建后端服务,提供用户认证、数据与模型管理、异步任务调度、解释算法调用及结果存储等功能;前端使用Vue配合Element UI和ECharts实现交互式可视化展示,支持特征贡献条形图、热力图、决策路径等多维度呈现。系统具备高可用、可扩展、安全合规等特点,适用于金融、医疗、工业、司法等多个领域。文档涵盖项目背景、架构设计、核心代码实现、数据库设计、API接口规范及部署方案,并提供了完整的前后端代码示例和模块封装。; 适合人群:具备Java和Vue开发基础的中初级研发人员、算法工程师、数据分析师以及从事AI系统开发与应用的相关技术人员。; 使用场景及目标:①构建面向多行业的AI模型可解释性服务平台,提升模型透明度与决策信任度;②实现黑盒模型的特征贡献分析与可视化展示,支持模型优化与合规审查;③学习前后端分离架构下复杂系统的设计与开发流程,掌握异步任务处理、RESTful API设计、数据可视化等关键技术。; 阅读建议:建议读者结合文档中的代码示例与系统架构图,逐步理解各模块功能与交互逻辑。可优先运行提供的完整代码示例,熟悉系统整体流程后再深入研读核心算法实现与前后端集成细节。在学习过程中,应重点关注异步任务调度、解释算法适配、前后端数据交互与安全控制等关键设计,以便在实际项目中进行复用与扩展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值