zoukankan      html  css  js  c++  java
  • IOS 中frame与bounds的区别

    文章摘要:http://www.sendong.com/news1733.html
    bounds是指这个view在它自己坐标系的坐标和大小 而frame指的是这个view在它superview的坐标系的坐标和大小
区别主要在坐标系这一块。

很明显一个是自己为原点的坐标系,一个是以屏 幕为原点的坐标系。绝对坐标。。。相对坐标。。。比如屏幕旋转的时候就要以相对来重绘。 
frame 如果一个按钮,是在表格里,按钮的frame 的坐标也是相对的,并不是相对屏幕,也就是说是相对坐标,不是绝对坐标

我也想知道任何一个uiview如何求得它在屏幕上的坐标。

    

view 的frame是view在它的super view 的位置与尺寸。
view 的bounds可以用来帮助它的subview来定位的 ,layoutSubviews。

Frame  is  in  terms  of superview's  coordinate  system   

框架是从父视图的坐标系统


Bounds   is in  terms  of   local  coordinate  system
是在局部坐标系统。

    frame和bounds是UIView中的两个属性(property)。
    frame指的是:该view在父view坐标系统中的位置和大小。(参照点是父亲的坐标系统)
    bounds指的是:该view在本身坐标系统中 的位置和大小。(参照点是本身坐标系统)


    ios视图frame和bounds的区别:
    bounds坐标:自己定义的坐标系统,setbound指明了本视图左上角在该坐标系统中的坐标,

            默认值(0,0)

    frame坐标:  子视图左上角在父视图坐标系统(bounds坐标系统)中的坐标,默认值(0,0)

    子视图实际位置=父视图实际位置-父视图bounds坐标+子视图frame坐标

    一、bounds

      只影响“子视图”相对屏幕的位置,修改时不会影响自身相对屏幕的位置

    1、父视图bounds坐标为(0,0)时


    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(self.view.frame),NSStringFromCGRect(self.view.bounds));
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(self.view.frame),NSStringFromCGRect(self.view.bounds));
    }

    2、父视图bounds坐标为(-20,-20)时 

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(self.view.frame),NSStringFromCGRect(self.view.bounds));
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        [self.view setBounds:CGRectMake(-20, -20, 320, 568)];
        
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(self.view.frame),NSStringFromCGRect(self.view.bounds));

    二、frame

      修改时改变了自己的在父视图坐标系统(bounds坐标系统)的位置,自身位置和

      子视图位置都会被改变。

    1、父视图frame坐标(0,0)


    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        
        UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        view2.backgroundColor = [UIColor yellowColor];
        [view1 addSubview:view2];
        
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));
     

    2、父视图frame坐标(60,60)


    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(60, 60, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        
        UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];
        view2.backgroundColor = [UIColor yellowColor];
        [view1 addSubview:view2];
        
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));

    三、说明

      根视图只能修改bounds坐标,而不可以修改frame坐标

      以下self.view为根视图

    1、初始状态

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];

    2、修改bounds坐标:有效

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        CGRect viewBounds = self.view.bounds;
        viewBounds.origin.y=-40;
        viewBounds.origin.x=-40;
        self.view.bounds=viewBounds;
        
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(self.view.frame),NSStringFromCGRect(self.view.bounds));

    3、修改frame坐标:无效

    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view, typically from a nib.
        
        UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 200, 260)];
        view1.backgroundColor = [UIColor redColor];
        [self.view addSubview:view1];
        CGRect viewFrame = self.view.frame;
        viewFrame.origin.y=60;
        viewFrame.origin.x=60;
        self.view.frame=viewFrame;
        
        NSLog(@"view frame:%@========view bounds:%@",NSStringFromCGRect(self.view.frame),NSStringFromCGRect(self.view.bounds));

  • 相关阅读:
    Yii “CDbConnection failed to open the DB connection: could not find driver"解决办法
    安装多个PHP环境会导致phpinfo和php -v中查看到的PHP版本不一致
    sql pivot、unpivot和partition by用法
    sql把字符数组转换成表
    sql获取数组指定元素
    sql获取数组长度
    Razor基础语法
    ADO.NET基础
    Asp.Net网站统一处理错误信息
    WebApp页面开发小结
  • 原文地址:https://www.cnblogs.com/it38/p/4999511.html
Copyright © 2011-2022 走看看