在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开发如何处理横竖屏

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

  2. 48 (OC)* 适配iPad和iPhone、以及横竖屏适配。

    一:核心方法 1.三个方法 1.1:开始就会触发 - (void)viewWillLayoutSubviews; 1.2:开始就会触发 - (void)viewDidLayoutSubviews; 1 ...

  3. iOS 横竖屏适配 笔记

    研究消息转发机制 已经一周多了,但是 还是没整理出博客, 还是先写一个 项目中遇到的 横竖屏适配问题. // 开启自动转屏 - (BOOL)shouldAutorotate { return YES; ...

  4. iOS 横竖屏适配

    关于横竖屏适配 也没做过,今天读别人的源码,遇到了.为了了解清楚,就系统的学习一下. 一 横竖屏方向枚举 关于横竖屏一共有三种枚举 UIInterfaceOrientation UIInterface ...

  5. css横竖屏适配

    Css做到横竖屏适配:定义两个样式 { @media screen and (orientation: portrait){ Css[竖向定义样式] } @media screen and (orie ...

  6. Andriod开发---《横竖屏切换时 Activity的生命周期的总结》

    横屏切换竖屏Activity的生命周期详解,下面分析一下切换时具体的生命周期: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--&g ...

  7. iPad横竖屏代码适配

    你可能非常了解用不同的方式去适配不同尺寸的iPhone屏幕,在适配iPhone屏幕时你需要考虑的只是屏幕大小变化带来的UI元素间隔的变化,但是在iPad上主要针对的是横竖屏下完全不同的UI元素的布局, ...

  8. AJ学IOS 之ipad开发qq空间项目横竖屏幕适配

    AJ分享,必须精品 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应 ...

  9. iPad开发(相对于iPhone开发时专有的API)

    iPad开发 一.iPad开发简介 1.什么是iPad 一款苹果公司于2010年发布的平板电脑 定价介于苹果的智能手机iPhone和笔记本电脑产品之间 跟iPhone一样,搭载的是iOS操作系统 2. ...

随机推荐

  1. Tenka1 Programmer Contest D - IntegerotS

    Problem Statement Seisu-ya, a store specializing in non-negative integers, sells N non-negative inte ...

  2. [bzoj1063][Noi2008]道路设计

    来自FallDream的博客,未经允许,请勿转载,谢谢. Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是 ...

  3. bzoj1531[POI2005]Bank notes 单调队列优化dp

    1531: [POI2005]Bank notes Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 559  Solved: 310[Submit][Sta ...

  4. bzoj3129[Sdoi2013]方程 exlucas+容斥原理

    3129: [Sdoi2013]方程 Time Limit: 30 Sec  Memory Limit: 256 MBSubmit: 582  Solved: 338[Submit][Status][ ...

  5. JsonArray转List,list转json字符串

    JsonArray data = object.getAsJsonArray("data"); Gson gson =new Gson(); List<Object> ...

  6. Genymotion配置遇到的坑

    1.Genymotion 无法Add下来 解决: ①首先打开Genymotion,的Settings然后找到VirtualBox,复制链接,在本地找到文件夹,然后返回上一层找到ova文件夹进入, ②然 ...

  7. 【转载】给想要入门渗透的人的忠告——schiz0wcingU

    最近发现很多拥有黑客梦想的年轻人在群里或者论坛里,找"师傅"或者学一些所谓的"社工" 这些找师傅的人当中,有极大一部分人是还在上学的学生,自然也就没有收入来源, ...

  8. 移动端meta标签缓存设置

    1.<meta charset="utf-8"> 2.<meta content="width=device-width, initial-scale= ...

  9. Gradle 1.12用户指南翻译——第五十三章. 签名插件

    其他章节的翻译请参见:http://blog.csdn.net/column/details/gradle-translation.html翻译项目请关注Github上的地址:https://gith ...

  10. Spark Streaming应用启动过程分析

    本文为SparkStreaming源码剖析的第三篇,主要分析SparkStreaming启动过程. 在调用StreamingContext.start方法后,进入JobScheduler.start方 ...