iOS设备横屏时,frame和bounds的分别

工程中有两个ViewControllers,其中ViewController是root view controller,底色是红色,上面有一个按钮,点击后加载GreenViewController,并显示其视图,底色是绿色。

首先是ViewController的代码:

#import "ViewController.h"
#import "GreenViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor redColor];
    self.view.autoresizingMask = UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth;

    UIButton *showGreenViewBtn = [UIButton buttonWithType:UIButtonTypeCustom];
    [showGreenViewBtn setTitle:@"Show Green" forState:UIControlStateNormal];
    showGreenViewBtn.frame = CGRectMake(0, 0, 100, 44);
    showGreenViewBtn.center = self.view.center;
    showGreenViewBtn.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleRightMargin | UIViewAutoresizingFlexibleTopMargin | UIViewAutoresizingFlexibleBottomMargin;
    [showGreenViewBtn addTarget:self action:@selector(showGreenView:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:showGreenViewBtn];
}

- (void)showGreenView:(id)sender {
    GreenViewController *greenVC = [GreenViewController new];
    [greenVC show];
}

@end

然后是GreenViewController的代码:

#import "GreenViewController.h"
#import "AppDelegate.h"

@interface GreenViewController ()

@end

@implementation GreenViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
    self.view.backgroundColor = [UIColor greenColor];
}

- (void)show {
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    UIViewController *rootViewController = appDelegate.window.rootViewController;
    [rootViewController addChildViewController:self];
    [rootViewController.view addSubview:self.view];

    NSLog(@"RootViewController");
    NSLog(@"f %@", NSStringFromCGRect(rootViewController.view.frame));
    NSLog(@"b %@", NSStringFromCGRect(rootViewController.view.bounds));

    NSLog(@"GreenViewController");
    NSLog(@"f %@", NSStringFromCGRect(self.view.frame));
    NSLog(@"b %@", NSStringFromCGRect(self.view.bounds));

    [self didMoveToParentViewController:rootViewController];
}

@end

如果是模拟器运行,视图的位置完全正常,因此必须真机运行(模拟器坑死人啊)。横放设备,让红色视图旋转。点击一下show green按钮,结果如下:

各种奇葩。。。

看看控制台的输出:

2014-07-18 10:29:42.754 FrameBoundsRotate[8588:60b] RootViewController
2014-07-18 10:29:42.756 FrameBoundsRotate[8588:60b] f {{0, 0}, {320, 568}}
2014-07-18 10:29:42.757 FrameBoundsRotate[8588:60b] b {{0, 0}, {568, 320}}
2014-07-18 10:29:42.758 FrameBoundsRotate[8588:60b] GreenViewController
2014-07-18 10:29:42.759 FrameBoundsRotate[8588:60b] f {{0, 0}, {320, 568}}
2014-07-18 10:29:42.760 FrameBoundsRotate[8588:60b] b {{0, 0}, {320, 568}}

原来在设备横屏时,RootViewController的视图的frame依然是(0, 0, 320, 568),而bounds则变成了(0, 0, 568, 320)。GreenViewController的视图的frame和bounds都没有变化,由于RootViewController的view的frame没有变化,所以GreenViewController的view的autoresizingMask属性不起作用。

为了解决以上横屏后添加视图时出现的位置变形问题,在show方法中加入self.view.frame = rootViewController.view.bounds,如下:

- (void)show {
    AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];
    UIViewController *rootViewController = appDelegate.window.rootViewController;
    [rootViewController addChildViewController:self];
    [rootViewController.view addSubview:self.view];
    self.view.frame = rootViewController.view.bounds;

    NSLog(@"RootViewController");
    NSLog(@"f %@", NSStringFromCGRect(rootViewController.view.frame));
    NSLog(@"b %@", NSStringFromCGRect(rootViewController.view.bounds));

    NSLog(@"GreenViewController");
    NSLog(@"f %@", NSStringFromCGRect(self.view.frame));
    NSLog(@"b %@", NSStringFromCGRect(self.view.bounds));

    [self didMoveToParentViewController:rootViewController];
}

再运行,没问题了:

控制台输出:

2014-07-18 10:32:30.320 FrameBoundsRotate[8593:60b] RootViewController
2014-07-18 10:32:30.323 FrameBoundsRotate[8593:60b] f {{0, 0}, {320, 568}}
2014-07-18 10:32:30.324 FrameBoundsRotate[8593:60b] b {{0, 0}, {568, 320}}
2014-07-18 10:32:30.325 FrameBoundsRotate[8593:60b] GreenViewController
2014-07-18 10:32:30.326 FrameBoundsRotate[8593:60b] f {{0, 0}, {568, 320}}
2014-07-18 10:32:30.327 FrameBoundsRotate[8593:60b] b {{0, 0}, {568, 320}}

总结:

模拟器坑死人,切记真机调试。

Demo地址:点击打开链接

iOS设备横屏时,frame和bounds的分别,布布扣,bubuko.com

时间: 2024-11-07 00:53:04

iOS设备横屏时,frame和bounds的分别的相关文章

IOS界面开发基础——Frame与Bounds

参考资料:http://blog.csdn.net/hherima/article/details/39501857 在IOS的UI开发中,经常需要对view进行定位.比较常用的概念就是Frame和Bound,通过view这两个属性,就可以任意的"摆弄"我们的view了. 这两个属性都可以定义view的位置和大小,但这两个属性之间有什么区别和联系呢?经过资料查找,记录如下: Frame与Bounds的基本概念 首先,Frame与Bounds都是一个CGRect结构: struct CG

iOS开发-View中frame和bounds区别

开发中调整View的时候的经常会遇到frame和bounds,刚开始看的时候不是很清楚,不过看了一下官方文档,frame是确定视图在父视图中的位置,和本身的大小,bounds确定可以确定子视图在当前视图中的位置,还可以改变View的大小,如果bounds确定大小,那么View的视图优先选择的bounds中的宽高.Center的位置是相对于父坐标系中的定位.苹果官方给了一张图片供参考: 如果还不是很清晰,可以参考一下frame和bounds的中代码: -(CGRect)frame{ return

iOS设备旋转支持横屏

ios设备支持旋转的方法: 1.修改工程的info.plist中"Supported interface orientations"的值(一般在工程的Taget-> General -> Deployment Info -> Device Orientation处打钩来选择设备支持). 2.实现工程的AppDelegate文件中的(application:supportedInterfaceOrientationsForWindow:)方法,在此方法中返回程序支持的方

iOS frame和Bounds 以及frame和bounds区别

frame frame是每个view必备的属性,代表的是当前视图的位置和大小,没有设置他,当前视图是看不到的.位置需要有参照物才能确定,数学中我们用坐标系来确定坐标系中的某个点的位置,iOS中有他特有的坐标系,如下图: iOS坐标系 在iOS坐标系中以左上角为坐标原点,往右为X正方向,往下是Y正方向 frame中的位置是以父视图的坐标系为标准来确定当前视图的位置 同样的默认情况下,本视图的左上角就是子视图的坐标原点 更改frame中位置,则当前视图的位置会发生改变 更改frame的大小,则当前视

ios view的frame和bounds之区别(位置和大小)

[转载]http://blog.csdn.net/mad1989/article/details/8711697前言: 学习iOS开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bound的含义.PS:我承认我是一个很笨很笨的人. 所以现在记录下来,供以后查阅,同时方便所有和我一样有疑惑的人查看. 一.首先列一下公认的资料: 先看到下面的代码你肯定就明白了一些:-(C

IOS开发之深入坐标系frame、bounds、center、 transform的不同与联系

有疑问的请加qq交流群:390438081 我的QQ:604886384(注明来意) 微信:niuting823 1.1 frame属性 a.什么是frame 类型:CGRect结构体(size  origin) 作用:该视图左顶点在父视图的坐标系下的位置,以及该视图在父视图中占据的宽和高 b.直接修改了frame,其他属性如何变化? bounds:     会 center:       会 transform:  不会 c.什么时候使用frame 当把一个视图添加到父视图中时,一定要设定fr

IOS开发面试题 UIView的frame和bounds属性的真正的区别

看过网上的很多对于frame  和 bounds的 区别的,大多都是千篇一律的! 大多数的说法是: frame  参考坐标系 是其父视图, bounds 的参考坐标系是其本身? 虽然大体上是对的,但几乎没有人能说的更具体更透彻一些. 根据我的研究: frame : 是指的子视图的左上角顶点在父视图中的坐标 bounds: 是 其本身作为父视图时,子视图的左上角在该坐标系中的位置坐标! bounds的这个属性是实现 UIScrollView的基石,通过改变 view的bounds可以 模拟出类似的

iOS View的Frame和bounds之区别,setbounds使用(深入探究)

前言: 在ios开发中经常遇到两个词Frame和bounds,本文主要阐述Frame和bound的区别,尤其是bound很绕,较难理解. 一.首先,看一下公认的资料: 先看到下面的代码你肯定就明白了一些: -(CGRect)frame{ return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height); } -(CGRect)bounds{ return

ios基础之 view的frame 与 bounds 的区别 (转)

前言: 学习ios开发有一段时间了,项目也做了两个了,今天看视频,突然发现view的frame和bound两个属性,发现bound怎么也想不明白,好像饶你了死胡同里,经过一番尝试和思考,终于弄明白bound的含义.PS:我承认我是一个很笨很笨的人. 所以现在记录下来,供以后查阅,同时方便所有和我一样有疑惑的人查看. 一.首先列一下公认的资料: 先看到下面的代码你肯定就明白了一些: -(CGRect)frame{     return CGRectMake(self.frame.origin.x,