(一〇八)iPad开发之横竖屏适配
在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开发之横竖屏适配的更多相关文章
- 移动端Web开发如何处理横竖屏
<!Doctype html> <html> <head> <meta charset="utf-8"> <meta id=& ...
- 48 (OC)* 适配iPad和iPhone、以及横竖屏适配。
一:核心方法 1.三个方法 1.1:开始就会触发 - (void)viewWillLayoutSubviews; 1.2:开始就会触发 - (void)viewDidLayoutSubviews; 1 ...
- iOS 横竖屏适配 笔记
研究消息转发机制 已经一周多了,但是 还是没整理出博客, 还是先写一个 项目中遇到的 横竖屏适配问题. // 开启自动转屏 - (BOOL)shouldAutorotate { return YES; ...
- iOS 横竖屏适配
关于横竖屏适配 也没做过,今天读别人的源码,遇到了.为了了解清楚,就系统的学习一下. 一 横竖屏方向枚举 关于横竖屏一共有三种枚举 UIInterfaceOrientation UIInterface ...
- css横竖屏适配
Css做到横竖屏适配:定义两个样式 { @media screen and (orientation: portrait){ Css[竖向定义样式] } @media screen and (orie ...
- Andriod开发---《横竖屏切换时 Activity的生命周期的总结》
横屏切换竖屏Activity的生命周期详解,下面分析一下切换时具体的生命周期: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--&g ...
- iPad横竖屏代码适配
你可能非常了解用不同的方式去适配不同尺寸的iPhone屏幕,在适配iPhone屏幕时你需要考虑的只是屏幕大小变化带来的UI元素间隔的变化,但是在iPad上主要针对的是横竖屏下完全不同的UI元素的布局, ...
- AJ学IOS 之ipad开发qq空间项目横竖屏幕适配
AJ分享,必须精品 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应 ...
- iPad开发(相对于iPhone开发时专有的API)
iPad开发 一.iPad开发简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定价介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2. ...
随机推荐
- UVA 1146 Now or later
The Terminal Radar Approach CONtrol (TRACON) controls aircraft approaching and departing when they a ...
- 最近i学习微信卡券中的会员卡功能,弄清楚不容易 ,分享一下。
创建会员卡接口 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025283 [4.1 创建会员卡接口] { " ...
- 环境变量方式使用 Secret - 每天5分钟玩转 Docker 容器技术(158)
通过 Volume 使用 Secret,容器必须从文件读取数据,会稍显麻烦,Kubernetes 还支持通过环境变量使用 Secret. Pod 配置文件示例如下: 创建 Pod 并读取 Secret ...
- TCP 通信
一.TCP与UDP的区别 二.ServerSocket与Socket 1 ServerSocket 以上介绍的几个构造方法中,第二个构造方法最常用. 2.Socket import java.io.* ...
- gulp填坑记(二)——gulp多张图片自动合成雪碧图
为优化图片,减少请求会把拿到切好的图标图片,通过ps(或者其他工具)把图片合并到一张图里面,再通过css定位把对于的样式写出来引用的html里面,对于一些图片较多的项目,这个过程可能要花费我们一天的时 ...
- 关于html+ashx开发中几个问题的解决方法
在跟html+ashx打交道的园友们肯定会发现,这种模式虽然优美,但在开发中会遇到一些难处理的地方.我也不例外,下面是自己在实际开发中总结出来的几条经验,希望跟大家分享,更希望得到大家的建议和更好的解 ...
- 实验与作业(Python)-04 数据类型、数学函数与字符串
截止日期 实验目标 继续熟悉for循环与turtle 数值运算符 math库常用函数 字符串转化为数值类型(int, float, complex) 字符串常用函数 实验内容 任务1.使用for代替w ...
- 实验-使用VisualVM或JConsole进行对程序进行性能分析
参考资料: 性能分析神器VisualVM java可视化监控工具 完成下列任务: 1.分析内存堆 使用+进行频繁的字符串拼接 2.CPU性能分析 3.线程分析 编程比较以下几个方法所创建的线程 Exe ...
- ejabberd开发和部署
ejabberd开发和部署 (金庆的专栏 2016.10) 搭建了自己的ejabberd集群,然后少量更改源码,实现定制的XMPP服务器. 从github fork ejabberd 库,定为 mas ...
- windows上安装nodejs,升级npm,安装webpack指南
安装nodejs https://nodejs.org/en/ 安装webpack和其他一些常用的 npm install -g node-gyp webpack coffee-script 监控 w ...