- 浏览: 38787 次
文章分类
最新评论
-
peng13123:
...
Hibernate4+Spring3+SpringMVC -
peng13123:
好吧,呵呵zxxwlj 写道 翻/墙?违法。。。
我想问为啥我goagent的文章被删除了 -
zxxwlj:
翻/墙?违法。。。
我想问为啥我goagent的文章被删除了
如果你准备将你的老的 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 ...”(不透明)类型可解决此问题。
你当然可以在 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 ...”(不透明)类型可解决此问题。
发表评论
-
Xcode7 ios9不能用http请求
2015-09-17 18:49 625Xcode7 使用NSURLSession发送HTTP请求的问 ... -
iOS UITableViewCell 中 调整imageView 的图片大小
2015-08-26 16:10 1300//设置图片 [cell.imageView setImage ... -
[转]iOS 万能跳转界面方法 (runtime实用篇一)
2015-08-24 10:27 538在开发项目中,会有这样变态的需求: 推送:根据服务端推送过来 ... -
周堋斐:梦想的开发者
2015-04-13 17:56 012年的深圳软件园也是各种。呵呵哒 -
IOS判断app在appstore是否有可用的更新
2015-03-13 10:25 498iTunes可以提供app的版本信息,主要通过appid获取, ... -
uitableview分割线 左右边距相同
2015-01-21 15:59 2483_myTableView1.separatorInset= ... -
在uiimageview中设置网络图片等比例大小
2014-12-30 15:38 689NSData *data=[NSData dataWith ... -
[转]iOS UISCrollView循环滚动 实现
2014-12-30 13:42 651google了半天发现很多人竟然搞不定,甚至还有人用数组左移右 ... -
push的时候,感觉上一个页面的视图还有残留,然后停顿了一下,才消失的解决
2014-12-10 20:04 1804这个,以前遇到过,后来不知怎么弄好了,现在就是你如果改下pus ... -
广告轮播
2014-11-17 20:05 432h <UIAlertViewDelegate,UIScr ... -
设置全局navigation barbuttonitem
2014-11-17 19:58 694#pragma mark 设置全局navigation bar ... -
nsdate 前一天,后一天
2014-11-17 19:57 1124h { NSDate *choseDate;//显示日 ... -
sdwebimage ios8 报错
2014-11-02 00:22 617报错:Use of undeclared identifier ... -
之前有人整理过Git上好用的iOS库,我搬运一下
2014-10-31 14:56 278之前有人整理过Git上好用的iOS库,我搬运一下: http: ... -
ios中添加和移除view
2014-08-14 11:36 787la = [[UILabel alloc]init]; ... -
UITextField只能输入数字且小数点后保留2位
2014-07-18 17:17 530#pragma mark UITextFieldDeleg ... -
NSTimer倒计时
2014-07-17 10:56 497// [NSTimer scheduledTimerWithT ... -
转】视图切换总结
2014-06-04 12:06 5121、利用ModalViewController切换View ... -
ios 判断网络连接以及获取路由信息
2014-05-29 11:53 1630首先 引入 Reachability.h 和Reachabil ... -
UINavigationController如何连续返回两级/回到第一级
2014-01-18 09:44 760//连续返回两级 int index=[[self.navig ...
相关推荐
qt5工程,实现类似于图片浏览器功能,QGraphicsView(平移/缩放/旋转);参考某大神的做法;
Android 程序技术;;PART2;;View动画的四种基本效果对应了四个Animation的子类,...这里使用相对布局作为整体布局,布局中通过四个按钮的点击事件,分别实现图片imageview 的平移、缩放,旋转和透明度的变化效果。;使用
整体思路 1、获取要截图的view 2、根据这个view创建Bitmap 3、保存图片,拿到图片路径 4、把图片路径传入自定义view(自定义view实现的功能:画圆角边框,动画缩小至消失) 主要用到的是ObjectAnimator属性动画的...
从直观上,弹幕效果就是在一个ViewGroup上增加一些View,然后让这些View移动起来。所以,整体的实现思路大概是这样的: 1、定义一个RelativeLayout,在里面动态添加TextView。 2、这些TextView的字体大小、颜色、...
Android中一共提供了两种动画,其一便是tween动画,tween动画通过对view的内容进行一系列的图像变换(包括平移,缩放,旋转,改变透明度)来实现动画效果,动画效果的定义可以使用xml,也可以使用编码来实现。...
也有分析认为,谷歌并不想做一个简单的手机终端制造商或者软件平台开发商,而意在一统传统互联网和 移 动互联网。----------------------------------- Android 编程基础 4 Android Android Android Android 手机新...
整体的游戏运动采取了背景运动而人不动的方式,感觉在这里这种要更容易掌控一些,分层很明显。2、平台 这里我参照了 Floyd 的Js版本实现,以 BlockBase 作为所有平台游戏的基类,实现了向上运动,检测玩家碰撞,移除...
在内容组织上,把学习高级语言的习惯和汇编语言的特点相结合,按“硬件资源—变量定义一指令系统—编程”的顺序安排相应的内容。结合MASM V6.1x的编程环境,使汇编语言源程序具有一定的高级语言特点和结构。书中用...
<<page 1>> page begin==================== 目 目目 目 录 录录 录 第一部分 C#语言概述.4 第一章 第一章第一章 第一章 .NET 编 编 ... 比尔....这一天 微软公司正式推出了其下一代...
Intel英特尔830-GS4X系列显卡驱动(含移动版/含Hdmi,移至Others.7z压缩包) nVIDIA RIVA TNT--GTX295全系列显卡驱动(注:nf5以下为纯驱动) Matrox G系列/Millennium G系列显卡驱动 SiS矽统系列集成显卡驱动 VIA(S3)...