接着昨天的学习,首先来研究一下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];
移动后的效果: