在iPad开发中,横竖屏的视图常常是不同的,例如侧边栏Dock,在横屏时用于屏幕较宽,可以展示足够多的内容,每个按钮都可以展示出标题;而竖屏时Dock应该比较窄,只显示图标不现实按钮标题。

iPad比较重要的知识是不同类型设备的宽高在以点为单位的图形坐标系下固定为768x1024,因此常常利用此值来判断横竖屏。

768、1024、横竖屏判断很常用,可以定义一个公共的常量文件来放这些内容。

【常量和宏的定义】

①在.m文件中,定义变量,加上const,注意指针(例如NSString*)使用的是常量,而不是常量指针。

// 屏幕竖屏时的宽度
const CGFloat HMScreenPW = 768;
// 屏幕横屏时的宽度
const CGFloat HMScreenLW = 1024;

对于指针量的定义:

NSString *const Title = @"Title";

②在.h文件中,使用extern声明上面的变量,利用宏判断横竖屏。

// 屏幕竖屏时的宽度
extern const CGFloat HMScreenPW;
// 屏幕横屏时的宽度
extern const CGFloat HMScreenLW;
#define Lanscape ([UIScreen mainScreen].bounds.size.width == HMScreenLW)
#define Portrait ([UIScreen mainScreen].bounds.size.width == HMScreenPW)

【适配的关键方法】

①屏幕旋转时会调用控制器的方法:

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration;

通过函数判断横竖屏:

UIInterfaceOrientationIsLandscape(toInterfaceOrientation)

常见用法:

注意在这个方法调用时屏幕旋转还未完成,在这里拿到的宽高将会是错误的(原来的)。

- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration
{// 调用此函数时还未完成旋转,当前高度是旧的if (UIInterfaceOrientationIsLandscape(toInterfaceOrientation)) { // 横屏} else { // 竖屏}}

在iOS8中,上面的方法已经过期,更新为下面的方法:

注意实现了这个方法上面的方法就失效了,因此为了适配应该用上面的方法。

// 实现了下面的方法上面的过期方法就不会调用了,为了适配应该使用老方法。
- (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator{NSLog(@"%@",NSStringFromCGSize(size));}

②UIView在尺寸被修改后,会调用layoutSubviews方法,可以通过重写此方法, 先调用父类方法,然后实现自己的布局逻辑,从而实现Dock等的横竖屏变换。

- (void)layoutSubviews
{[super layoutSubviews];// 自己的布局逻辑
}

【复杂视图的切分】

对于一个复杂的视图,常常需要多次切分,然后分别处理,例如下面的视图的切分:

首先整个控制器视图被切分为ContentView和Dock两部分,Dock内部又进行了细分,在竖屏时,Dock应该变窄,下面的所有按钮都是竖着排列,并且不显示标题,如下图所示:

切分完毕后,处理适配就变得简单了。首先屏幕旋转会调用控制器的方法,控制器直接修改Dock尺寸,从而调用了Dock的layoutSubviews方法,Dock在此方法中又对HeadView、Tabbar、Toobar的尺寸进行了修改,又调用了它们各自的layoutSubviews方法,因为只需要在layoutSubviews中处理尺寸改变即可。

(一〇八)iPad开发之横竖屏适配相关推荐

  1. 移动Web开发实战-横竖屏适配

    概述 在我们平时的移动Web页面开发过程中,经常会遇到需要横竖屏处理的情况.一般情况下我会项目实际情况,比如页面一般打开的情景是横屏还是竖屏,项目是否需要增加横竖屏适配,页面结构是否复杂等. 情景一 ...

  2. 移动端Web开发如何处理横竖屏

    <!Doctype html> <html> <head> <meta charset="utf-8"> <meta id=& ...

  3. Android开发中横竖屏切换的问题以及系统提供的常用Activity

    Android开发中横竖屏切换的问题以及系统提供的常用Activity(总结) 2018年06月28日 16:18:45 北极熊的微笑 阅读数:72 横竖屏切换与状态保存的问题 前面也也说到了App横 ...

  4. Opencv 摄像头二次开发,横竖屏切换,前后摄像头切换,铺满全屏问题,一次解决(附源码)

    Android Opencv 4.2 摄像头二次开发之 横竖屏切换,前后摄像头切换,铺满全屏问题,相机无法启动问题,一次解决 问题1.横竖屏切换崩溃问题 描述: 主要是原生的Opencv demo中没 ...

  5. cocos2d-x游戏开发屏幕横竖屏切换

    android解决方案: 1.在游戏的主activity中编写一个静态方法(继承Cocos2dxActivity) public static void changedActivityOrientat ...

  6. ipad 横竖屏适配+多任务+分屏

    ipad经常要求可以支持横屏.分屏: 首先配置项目环境 1.支持横竖屏 2.plist添加配置 3.launch Screen File 必须有值 4. UI 使用自动布局 转载于:https://w ...

  7. IPHONE/IPAD开发模拟器截屏

    MAC下有Shift+Command+3/4,可以全屏幕与区域截屏,但是在做iPhone/iPad软件提交的时候,要规定大小,截得很麻烦. 找到一个很方便的快捷方式: Control+Command+ ...

  8. iOS开发~WKWebView白屏适配

    WKWebView虽好,但白屏问题也很苦恼,下面分享一下自己解决问题的过程. 公司项目使用Cordova框架,做原生项目嵌入H5,业务复杂了以后,H5资源也越来越大,占用内存越来越多,加载也越来越慢, ...

  9. H5横竖屏适配代码,强制横屏

    1.强制横屏代码,检测用户屏幕方向,竖屏时提示用户将屏幕翻转 <style>@media all and (orientation: portrait) {html, body {posi ...

最新文章

  1. Android SDK 路径修改
  2. 【NIO】阻塞与非阻塞
  3. AI Studio 不同环境下的执行速度
  4. Jquery中替换节点的方法replaceWith()和replaceAll()
  5. Vue-Treeselect 的下拉菜单不出Table的框
  6. 20200210:(leetcode 623)在二叉树中增加一行
  7. Java安全的发布对象
  8. pytorch常见问题之cpu占满
  9. yum源中repodata目录下的各文件内容及作用-转载
  10. 电池SOH仿真系列-基于LSTM神经网络的电池SOH估算方法
  11. 字子序列中英翻译模型(五笔特征)
  12. mysql数据存固态盘和硬盘区别_对机械硬盘和SSD固态硬盘IOPS、吞吐量的压测对比...
  13. 没事别想不开去创业公司
  14. 大数据中为什么使用Scala?
  15. 计算机的隐藏游戏怎么找回,文件夹隐藏了怎么恢复,电脑屏幕上文件夹隐藏了怎么恢复...
  16. stm32mp157开发板常用系统工具使用
  17. nginx必须使用域名访问的两种设置方法
  18. mysql 唯一索引出现重复数据_mysql使用唯一索引避免插入重复数据
  19. 部分dcm文件使用jpeg2000压缩会出错
  20. 无人机常用术语及缩写

热门文章

  1. 恶意攻击行为之扫描PhpMyAdmin的溯源分析
  2. java毕业生设计在线学习系统计算机源码+系统+mysql+调试部署+lw
  3. cscd期刊是c刊吗_什么叫CSCD期刊?还有个CSCD扩展版,都是什么意思呀,跟核心期刊有区别吗?...
  4. Netlogon 特权提升漏洞复现(CVE-2020-1472)
  5. 数据库-SQL语句练手
  6. Chrome扩展插件、360浏览器扩展插件中遇到的问题
  7. 中国应该要学习其他国家的节约用水方法
  8. “当迷茫时就回到原点,或者退一步再思考” | 技术人金句系列
  9. 2018年中IT好课盘点 速来围观百万学员的口碑课程
  10. 从应用火到股市 AIGC概念股连涨仨月