接着昨天的学习,首先来研究一下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 ><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];
    }

运行效果:


ios uiview弧形边框 uiview frame bounds_ios uiview弧形边框


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

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

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


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



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



移动后的效果:

ios uiview弧形边框 uiview frame bounds_uiview_02