UIKit框架 -UIView and frame和bounds之区别(位置和大小)

//IOS中,使用UIWindow类来表示窗口,通常一个程序只创建一个UIWindow

    

//1.创建window

//    //创建一个window,并铺满全屏

    _window=[[UIWindow alloc]initWithFrame:[[UIScreen mainScreen]bounds]];

//2.导入屏幕

   //背景颜色

    [_window setBackgroundColor:[UIColor blueColor]];

    

    //自定义颜色

//    [_window setBackgroundColor:[UIColor colorWithHue:28/255 saturation:173/255 brightness:253/255 alpha:1]];

    

    //创建一个视图控制器

    Kuangjia *kuangjia=[[Kuangjia alloc]init];

    //设置window的根视图

    [_window setRootViewController:kuangjia];

    //绘制window(使window显示)

    [_window makeKeyAndVisible];

//    

    

//    

//    //创建UIView

//    //创建视图

//#warning 创建空件第一步,申请内存空间并初始化

//    UIView *view=[[UIView alloc]init];

//#warning  第二步,设置坐标大小

//    [view setFrame:CGRectMake(0, 0, 200, 200)];

//  

//#warning 第三步.设置空间属性

//    view.backgroundColor=[UIColor redColor];

//    

    //更改视图位置为视图中心

    [view setCenter:self.window.center];

    [view setCenter:CGPointMake([UIScreen mainScreen].bounds.size.width/2, [UIScreen mainScreen].bounds.size.height/2)];

//#warning 第四步,添加子视图

//    //将视图添加到window上进行显示

//    [self.window addSubview:view];

//    

//#warning 第五步,释放视图对象

//    [view release];//MRC需释放

//    

//    //获取父视图

//    NSLog(@"%@",view.superview);

//    //获取所有子视图subviews

//    NSLog(@"%@",self.window.subviews);

//    //tag,相当于给视图做一个标记,可以通过父视图调用viewWithTag方法获取到视图的对象

    UIView *newView=[self.window viewWithTag:1];

    [newView setBackgroundColor:[UIColor magentaColor]];

    

    //通过tag值更改颜色

    UIView *view1=[[UIView alloc ]initWithFrame:CGRectMake(10, 10, 100, 100)];

    view1.backgroundColor=[UIColor greenColor];

    [self.window addSubview:view1];

    [view1 release];

    

    UIView *view2=[[UIView alloc]initWithFrame:CGRectMake(40, 40, 100, 100)];

    [view2 setBackgroundColor:[UIColor yellowColor]];

    [self.window addSubview:view2];

    [view2 release];

    

    UIView *view3=[[UIView alloc]initWithFrame:CGRectMake(70, 70, 100, 100)];

    [view3 setBackgroundColor:[UIColor whiteColor]];

    //在指定的位置处插入子视图(放在view1view2间,放在第二个)

   // [self.window insertSubview:view3 atIndex:2];

    

    //在指定视图的上面添加子视图(view3放在view2的上面)

    //[self.window insertSubview:view3 aboveSubview:view2];

    

    //在指定视图的下面添加子视图(3放在2的下面)

   // [self.window insertSubview:view3 belowSubview:view2];

    

    //把指定的子视图移到最前面(坐标不变)

    //[self.window bringSubviewToFront:view1];

    

    //把指定的子视图移到最后面(坐标不变)

    //[self.window sendSubviewToBack:view2];

    

    //交换两个指定索引位置的子视图(坐标不变)

    //[self.window exchangeSubviewAtIndex:1 withSubviewAtIndex:2];

    

    //从父视图中移除某个视图

    //[view2 removeFromSuperview];

   

  //当一个视图被创建以后会根据父视图坐标系确定自己的位置大小,同时会生成一套以自己左上角为原点坐标

    //bounds就是该视图在自己这套坐标系中的位置以及大小

    //bounds只会影响自身子视图的位置

    

    //frame坐标,根据父视图位置计算

//    UIView *view7=[[UIView alloc]initWithFrame:CGRectMake(0, 0, 200, 200)];

//    [view2 setBounds:CGRectMake(20, 20, 200, 200)];

//    for (UIView *v in self.window.subviews){

//        NSLog(@"VVVV=%@",v);

//    }

//    [view7 setBackgroundColor:[UIColor orangeColor]];

//    [view2 addSubview:view7];

//    

//  

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

一、首先列一下公认的资料:

先看到下面的代码你肯定就明白了一些:
-(CGRect)frame{
    return CGRectMake(self.frame.origin.x,self.frame.origin.y,self.frame.size.width,self.frame.size.height);
}
-(CGRect)bounds{
    return CGRectMake(0,0,self.frame.size.width,self.frame.size.height);
}
很明显,bounds的原点是(0,0)点(就是view本身的坐标系统,默认永远都是0,0点,除非认为setbounds),而frame的原点却是任意的(相对于父视图中的坐标位置)。


再来看张图就明白了,



        frame: 该view在父view坐标系统中的位置和大小。(参照点是,父亲的坐标系统)
        bounds:该view在本地坐标系统中的位置和大小。(参照点是,本地坐标系统,就相当于ViewB自己的坐标系统,以0,0点为起点)
        center:该view的中心点在父view坐标系统中的位置和大小。(参照电是,父亲的坐标系统)

我个人认为,bounds稍微有点费解,稍不留神,想的多了,就会绕进去。每个view都有一个本地坐标系统。这个坐标系统作用比较重要,比如触 摸的回调函数中的UITouch里面的>坐标值都是参照这个本地坐标系统的坐标。当然bounds这个属性也是参照这个本地坐标系统来的。其实本地 坐标系统的关键就是要知道的它的原点(0,0)在什么位置(这个位置又是相对于上层的view的本地坐标系统而言的,当然最上面的一层view就是 window它的本地坐标系统原点就是屏幕的左上角了)。通过修改view的bounds属性可以修改本地坐标系统的原点位置。


所以,我个人认为,bounds影响到子view的位置和大小。



二、demo演示:

[cpp]  view plain copy
  1. UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(20, 20, 280, 250)];  
  2. [view1 setBounds:CGRectMake(-20, -20, 280, 250)];  
  3. view1.backgroundColor = [UIColor redColor];  
  4. [self.view addSubview:view1];//添加到self.view  
  5. NSLog(@"view1 frame:%@========view1 bounds:%@",NSStringFromCGRect(view1.frame),NSStringFromCGRect(view1.bounds));  
  6.   
  7. UIView *view2 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];  
  8. view2.backgroundColor = [UIColor yellowColor];  
  9. [view1 addSubview:view2];//添加到view1上,[此时view1坐标系左上角起点为(-20,-20)]  
  10. NSLog(@"view2 frame:%@========view2 bounds:%@",NSStringFromCGRect(view2.frame),NSStringFromCGRect(view2.bounds));  




(log输出日志表明,每个新的view默认的bounds其实都是(0,0)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值