`

view整体上移

    博客分类:
  • ios
 
阅读更多
如果你准备将你的老的 iOS 6 app 迁移到 iOS 7/8 上,那么你必须注意了。当你的老的 app 在 iOS 7 设备上运行时,所有ViewController 的视图都整体上移了,因为 iOS 7 把整个屏幕高度(包括状态栏和导航栏)都作为了视图控制器的有效高度。于是你的视图上移了,并和上层的状态栏交叠在一起。

你当然可以在 Xcode 中修改每个 View,将他们下移20个像素(状态栏高度)或者64个像素(状态栏+导航栏高度)。

但是苹果显然已经考虑到这个问题,他们在 iOS 7 SDK 中为 ViewController 提供了一个 edgesForExtendedLayout 新属性。如果你将这个属性设置为UIRectEdgeNone,则 viewController 的所有子视图都会自动调整,这样在 iOS 7 下看到的效果和 iOS 6 完全一样。

为了方便,你可以为 UIViewController 扩展一个子类,并覆盖它的 viewDidLoad 方法:

@implementation DerivedViewController

- (void)viewDidLoad

{

    [superviewDidLoad];

if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])

       self.edgesForExtendedLayout = UIRectEdgeNone;

}

@end

然后你以后所有的 ViewController 都从这个 DerivedViewController 类继承。

但不幸的是,我们的程序仍然有大量 iOS<7 的用户 ,我们无法立即抛弃对 iOS 6 的支持。无论 edgesForExtendedLayout 还是UIRectEdgeNone,都只能在 iOS7 下有效。对于 iOS 6,我将以上代码修改为:

- (void)viewDidLoad

{

    [superviewDidLoad];

#if__IPHONE_OS_VERSION_MAX_ALLOWED >= 70000

    if ([selfrespondsToSelector:@selector(edgesForExtendedLayout)])

       self.edgesForExtendedLayout = UIRectEdgeNone;

#else

    float barHeight =0;

    if (!isIPad()&& ![[UIApplication sharedApplication] isStatusBarHidden]) {

       barHeight+=([[UIApplication sharedApplication]statusBarFrame]).size.height;

    }

    if(self.navigationController &&!self.navigationController.navigationBarHidden) {

       barHeight+=self.navigationController.navigationBar.frame.size.height;

    }

    for (UIView *viewin self.view.subviews) {

      

       if ([view isKindOfClass:[UIScrollView class]]) {

           view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height - barHeight);

        } else {

           view.frame = CGRectMake(view.frame.origin.x, view.frame.origin.y +barHeight, view.frame.size.width, view.frame.size.height);

       }

    }

#endif

}

通过宏 __IPHONE_OS_VERSION_MAX_ALLOWED 判断 deployment target 是否 >7.0。>7.0则使用新的 edgesForExtendedLayout API,负责使用比较笨的方法逐个下移 subviews,并自动根据状态栏/导航栏的可视状态计算要移动的偏移量。

注:如果已升级至Xcode5,将导航控制器的 Top Bar 设置为一种“Opacque ...”(不透明)类型可解决此问题。
分享到:
评论

相关推荐

    QGraphicsView(平移/缩放/旋转)

    qt5工程,实现类似于图片浏览器功能,QGraphicsView(平移/缩放/旋转);参考某大神的做法;

    Android程序技术:动画补间动画.pptx

    Android 程序技术;;PART2;;View动画的四种基本效果对应了四个Animation的子类,...这里使用相对布局作为整体布局,布局中通过四个按钮的点击事件,分别实现图片imageview 的平移、缩放,旋转和透明度的变化效果。;使用

    android实现截图并动画消失效果的思路详解

    整体思路 1、获取要截图的view 2、根据这个view创建Bitmap 3、保存图片,拿到图片路径 4、把图片路径传入自定义view(自定义view实现的功能:画圆角边框,动画缩小至消失) 主要用到的是ObjectAnimator属性动画的...

    实例解析如何在Android应用中实现弹幕动画效果

     从直观上,弹幕效果就是在一个ViewGroup上增加一些View,然后让这些View移动起来。所以,整体的实现思路大概是这样的: 1、定义一个RelativeLayout,在里面动态添加TextView。 2、这些TextView的字体大小、颜色、...

    Android基础知识之tween动画效果

    Android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可以使用编码来实现。...

    新版Android开发教程.rar

    也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...

    是男人就下100层游戏

    整体的游戏运动采取了背景运动而人不动的方式,感觉在这里这种要更容易掌控一些,分层很明显。2、平台 这里我参照了 Floyd 的Js版本实现,以 BlockBase 作为所有平台游戏的基类,实现了向上运动,检测玩家碰撞,移除...

    汇编语言程序设计 第二版

     在内容组织上,把学习高级语言的习惯和汇编语言的特点相结合,按“硬件资源—变量定义一指令系统—编程”的顺序安排相应的内容。结合MASM V6.1x的编程环境,使汇编语言源程序具有一定的高级语言特点和结构。书中用...

    C#微软培训资料

    &lt;&lt;page 1&gt;&gt; page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...

    香槟网络系统 G H O S T XP SP3 7.0

    Intel英特尔830-GS4X系列显卡驱动(含移动版/含Hdmi,移至Others.7z压缩包) nVIDIA RIVA TNT--GTX295全系列显卡驱动(注:nf5以下为纯驱动) Matrox G系列/Millennium G系列显卡驱动 SiS矽统系列集成显卡驱动 VIA(S3)...

Global site tag (gtag.js) - Google Analytics