(一〇八)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中处理尺寸改变即可。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-15 07:08:49

(一〇八)iPad开发之横竖屏适配的相关文章

iOS iPad开发之横竖屏适配

1. 做横竖屏适配的时,需要判断当前状态是横屏还是竖屏,有两种方法: 第1种:[UIScreen mainScreen].bounds.size.width == 768 优点:把这个抽成宏之后,随时可以判断横竖屏, #define Lanscape ([UIScreen mainScreen].bounds.size.width == 768) 缺点:只在iOS8可行,也就是说在iOS8中横屏的width=1024,竖屏的width=768; 而在iOS7上,横竖屏的width=768 第2种

移动视频开发中横竖屏转换遇到的BUG(Android)

剧情铺垫:首先申明,我是一个Android初学者.最开始我们想做一个视频通话软件,很快就找到了AnyChat.但当时用的是官网的demo,只支持横屏.我们想做成横竖屏都支持的效果. 遇到的问题 1.自己的视频会被对方的视频挡住 2.自己的视频横竖比例不对 3.自己的视频将音量条挡住 4.自己的视频不能居中 问题1的处理 尝试1:由于较熟悉web方面的知识,最先想到用z-index控制View的叠放,结果悲剧的没找到z-index类似物 尝试2:Android中,xml排在后的会覆盖排在前的,但这

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

android解决方案: 1.在游戏的主activity中编写一个静态方法(继承Cocos2dxActivity) public static void changedActivityOrientation(int orientation){ switch(orientation) { case 1://横屏 instance.setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); break; case 2://竖

ios开发强制横竖屏转换

第一种:手动的设置界面元素的旋转,包括状态栏.导航栏和视图.以下代码为从竖屏设置为横屏,坐标系是以竖屏的为基准,所以会出现负数的坐标值. //设置状态栏旋转 [[UIApplication sharedApplication] setStatusBarOrientation:UIDeviceOrientationLandscapeRightanimated:YES]; CGFloat duration = [UIApplication sharedApplication].statusBarOr

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

一:核心方法 1.三个方法 1.1:开始就会触发 - (void)viewWillLayoutSubviews; 1.2:开始就会触发 - (void)viewDidLayoutSubviews; 1.3:设备旋转的时候会触发.在UIScreen的bounds和size(下面方法中的参数).按照size为主. - (void)viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id <UIViewControllerT

iPad纯代码实现横竖屏切换,采用相对布局

因为本来不喜欢使用StoryBoard.xib等可视化编程,一直使用的纯代码布局,但是纯代码布局的iOS开发者会遇到一个问题,就是横竖屏适配的问题,如果使用自动布局,那些约束的,写起来都是不难,但是控件之间的关联太多,以至于维护性很差.本人由于工作的原因,做iPad开发,那就必须要解决横竖屏适配的问题,于是就有了这篇文章. 代码如下: // //  ViewController.swift //  iPad横竖屏切换 // //  Created by zhangxu on 16/7/30. /

猫猫学iOS之ipad开发qq空间项目横竖屏幕适配

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243 一:效果图 先看效果 二:结构图 如图所示: 其中用到了UIView+extension分类 Masonry第三方框架做子控制器的适配 NYHomeViewController对应主页也就是全部 NYDock是左边的菜单栏 放置各个选项卡等按钮功能区域 NYIconView头像 NYTabBar选项卡 NYToolBar最下面的功能区 NYTabBarButto

纯代码适配iPad横竖屏

网上大量的文章在适配iPad横竖屏时都使用了xib或storyboad, 但是xib和storyboard并不受团队开发欢迎,下面介绍采用纯代码的方式适配iPad的横屏和竖屏,方法非常简单: 1.) 设置要适配的对象的autoresizingMask,  eg: targetView.autoresizingMask = UIViewAutoresizingFlexibleHeight; 2.)   在当前的视图控制器中调用[self willRotateToInterfaceOrientati

移动Web开发—处理设备的横竖屏

为了应对移动设备屏幕的碎片化,我们在开发Mobile Web应用时,一个最佳实践就是采用流式布局,保证最大可能地利用有限的屏幕空间.由于屏幕存在着方向性,用户在切换了屏幕的方向后,有些设计上或实现上的问题就会凸显——我们至少需要处理一下当前显示元素的宽度的适配(当然,要做的可能不仅仅是这个).很多时候,我们需要为不同的屏幕方向来设计对应的应用显示模式,这个时候,实时地获知设备的模竖屏状态就显得极为重要. http://dict.baidu.com/s?wd=%E6%B4%9B%E4%B8%BD%