iOS UI学习笔记(二)View的frame和bounds,center

来源:互联网 发布:淘宝店买卖流程及费用 编辑:程序博客网 时间:2024/05/23 21:23

接着昨天的学习,首先来研究一下UIView类的frame属性和bounds属性的区别。

frame是以父视图为参考系,bounds则是以自身为参考系。

下面是直观的实验代码,用来区分frame和bounds的区别:

<span style="font-size:14px;">AppDelegate.m</span>

<span style="font-size:14px;">- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];    // Override point for customization after application launch.    self.window.backgroundColor = [UIColor whiteColor];    [self.window makeKeyAndVisible];       //创建一个窗口,背景设置为红色    UIView *myView1 = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 100, 100)];    [myView1 setBackgroundColor:[UIColor redColor]];    [self.window addSubview:myView1];    //创建另一个窗口,背景设置为蓝色    UIView *myView = [[UIView alloc]initWithFrame:CGRectMake(10, 10, 80, 80)];    [myView setBackgroundColor:[UIColor yellowColor]];    [myView1 addSubview:myView];    //得到myViwe的frame并转换为字符串类型    NSString *frame = NSStringFromCGRect(myView1.frame);    NSString *bounds = NSStringFromCGRect(myView1.bounds);        NSLog(@"frame = %@",frame);    NSLog(@"boounds = %@",bounds);        //改变一下bounds的值    [myView1 setBounds:CGRectMake(10, 10, 100, 100)];       return YES;}</span>

运行可查看视图的frame和bounds的值,结果就不上图了,可以自己运行试一试,在这里注意,新建的工程和上一节不一样的是,我们导入了一个空模板。

在设置bounds与frame时,其origina值可以为负数。但注意设置为负数时,其位置的换算。

当bounds的值改变之后,会影响到其子视图在其上的位置显示。

//查看一下屏幕的bounds    NSString *screenBounds = NSStringFromCGRect([UIScreen mainScreen].bounds);    NSLog(@"bounds = %@",screenBounds);

可以获得屏幕的bounds值。

 //视图中心点,参照系为父视图    NSString *centerMyView = NSStringFromCGPoint(myView1.center);    NSLog(@"center----%@",centerMyView);    [myView1 setCenter:CGPointMake([self.window frame].size.width/2, [self.window frame].size.height/2)];

查看一下第一个视图的中心点,并修改其值,可以发现,红色的视图移动到屏幕中间了,也就是说,修改其center属性之后,其frame属性的orgina属性也跟着发生改变。
[UIScreen mainScreen].bounds
注意得到屏幕的宽高的方法,最好用上面的得到,在视图特别多的情况下比较稳妥。

[myView1 setCenter:[self.window center]];
也可以用这种方法使两个视图重合并中心点一致。

注意点语法的使用,oc中的点语法与C语言体系下的点语法必须区分开,否则连点容易出错。

在bounds中修改size,frame的size也会改变。

一些常见的属性:

 //设置当前视图的透明度,范围值为0-1    myView1.alpha = 0.5;


//将当前视图隐藏    myView1.hidden = YES;


  //获取父视图    [myView1 superview];

在这里注意,如果没有父视图,或者在执行添加父视图的时候,获取的值为null;


//获取所有的子视图    NSArray *array = myView1.subviews;


//通过RGB值获得一个颜色对象(随机)    UIColor *myColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
注意三原色所需的值在0~1之间,但三原色的范围在0~255之间。

宏定义的规则,要注意其运算优先级,在后续的编程中,会大量使用到。

#define MYMAX(A,B) ((A)>(B)?(A):(B))//注意宏定义的使用规则
<p class="p1"><span class="s1">#define RGBA(r,g,b,a) [UIColor colorWithRed:(r)/</span><span class="s2">255.0</span><span class="s1"> green:(g)/</span><span class="s2">255.0</span><span class="s1"> blue:(b)/</span><span class="s2">255.0</span><span class="s1"> alpha:(a)]</span></p>//宏定义颜色
建议多使用,熟悉宏定义。


创建一个具有层次感的视图
//创建一个窗口,背景设置为红色    UIView *myView1 = [[UIView alloc]initWithFrame:CGRectMake(50, 50, 200, 100)];        [myView1 setBackgroundColor:[UIColor redColor]];    NSLog(@"-----%@",myView1.superview);    [self.window addSubview:myView1];    for (int i = 0; i < 5; i++) {        UIView *myViewTem = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 100-i*10, 100-i*10)];        myViewTem.center = myView1.center;        [myViewTem setBackgroundColor:[UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1]];        [self.window addSubview:myViewTem];    }
运行效果:

在上面的代码中,有个疑问,就是如果要管理生成的视图,怎么去找到它?

那么,为了方便找到,我们可以在视图初始化之后,给他加标记。

这样在for循环的外面,就可以通过tag值得到对应的视图。

 //每一个视图都可以加标记,让我们可以找到该视图,由于如果不设置标记,系统会默认给一个标记,所以我们人为赋值时,为了避免和系统标记值冲突,一般1000起步        myViewTem.tag = 1000+i;

 //通过tag得到并移动视图    UIView *view=[self.window viewWithTag:1004];    [self.window sendSubviewToBack:view];

移动后的效果:




0 0