-
Notifications
You must be signed in to change notification settings - Fork 196
alpha、clearColor、opaque、hidden你能分清吗
alpha
属性值为浮点类型,范围是0.0
至1.0
:0.0
代表完全透明,1.0
代表完全不透明。
下图显示了大矩形alpha
值分别为1.0、0.75、0.5、0.1、0.0时的情况:
下面,我们通过一段代码看下alpha
值对视图的影响:
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];
[self.view addSubview:aView];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
textView.text = @"pro648";
[aView addSubview:textView];
textView.alpha = 0.25;
aView.backgroundColor = [UIColor whiteColor];
textView.backgroundColor = [UIColor redColor];
运行结果:
在上面的代码中,我们首先添加一个UIView
对象aView
到视图控制器的上半部分,然后在aView
中添加UITextView
对象textView
。设置aView
背景颜色为白色,textView
背景颜色为红色,并设置textView
的alpha
值为0.25
。在运行结果中我们可以看到alpha
不仅影响视图的backgroundColor,也会影响视图上的文字。
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];
[self.view addSubview:aView];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
textView.text = @"pro648";
[aView addSubview:textView];
aView.alpha = 0.5;
NSLog(@"aView alpha is:%f",aView.alpha);
NSLog(@"textView alpha is:%f",textView.alpha);
运行后输出如下:
aView alpha is:0.500000
textView alpha is:1.000000
可以看到改变aView
的alpha
值,子视图textView
的alpha
值不会改变。
更新代码如下:
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];
[self.view addSubview:aView];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
textView.text = @"pro648";
[aView addSubview:textView];
aView.alpha = 0.5;
textView.alpha = 0.5;
aView.backgroundColor = [UIColor whiteColor];
textView.backgroundColor = [UIColor redColor];
NSLog(@"aView alpha is:%f",aView.alpha);
NSLog(@"textView alpha is:%f",textView.alpha);
上面代码里设置aView
和textView
的alpha
值均为0.5
,所以视图最终显示的alpha
值为:0.5*0.5=0.25。
运行结果如下:
仔细观察,你会发现该视图显示效果与1 中的视图显示效果一致,均为0.25。但是视图本身的alpha
值并没有被改变,控制台输出结果如下所示:
aView alpha is:0.500000
textView alpha is:0.500000
4.如果只想设定视图背景颜色的alpha值而不影响其他视图的显示效果,可以使用colorWithRed: green: blue: alpha:
方法定义一个有着特定alpha值的颜色来作为视图的背景颜色。
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];
[self.view addSubview:aView];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
textView.text = @"pro648";
[aView addSubview:textView];
aView.backgroundColor = [UIColor colorWithRed:255/255.0f green:255/255.0f blue:255/255.0f alpha:0.3];
textView.backgroundColor = [UIColor redColor];
NSLog(@"aView alpha is:%f",aView.alpha);
NSLog(@"textView alpha is:%f",textView.alpha);
运行后显示如下:
可以看到,子视图textView
的显示完全不受影响。控制台输出结果为:
aView alpha is:1.000000
textView alpha is:1.000000
更新代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];
[self.view addSubview:aView];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
textView.text = @"pro648";
[aView addSubview:textView];
textView.alpha = 0;
aView.backgroundColor = [UIColor redColor];
textView.backgroundColor = [UIColor greenColor];
[textView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]];
NSLog(@"aView alpha is:%f",aView.alpha);
NSLog(@"textView alpha is:%f",textView.alpha);
}
- (void)handleTapGesture:(UITapGestureRecognizer *)tapGesture {
NSLog(@"Single Tap");
}
把textView
视图alpha
设定为零,并添加点击手势。运行后如下:
可以看到textView
视图和文本都没有显示,且点击CGRectMake(50, 50, 100, 100)
区域,控制台没有任何输出。
事实上,iOS上不可见的视图均不可响应事件。
另外,改变
alpha
值的过程也可以使用动画。
backgroundColor
是出现在UIView
背面颜色的特殊色调,clearColor
表示无背景颜色,和nil
效果一致,但是clearColor
的视图可以响应event。
- (void)viewDidLoad {
[super viewDidLoad];
UIView *aView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height/2)];
[self.view addSubview:aView];
UITextView *textView = [[UITextView alloc] initWithFrame:CGRectMake(50, 50, 100, 100)];
textView.text = @"pro648";
[aView addSubview:textView];
aView.backgroundColor = [UIColor redColor];
textView.backgroundColor = [UIColor clearColor];
// textView.backgroundColor = nil; // 与上面一行效果一致
[textView addGestureRecognizer:[[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleTapGesture:)]];
NSLog(@"aView alpha is:%f",aView.alpha);
NSLog(@"textView alpha is:%f",textView.alpha);
}
- (void)handleTapGesture:(UITapGestureRecognizer *)tapGesture {
NSLog(@"Single Tap");
}
运行后如下图:
设置为clearColor
的textView
没有颜色,直接透过显示后面aView
视图的颜色,所以clearColor
就像一层玻璃。另外clearColor
视图上的文字是可见的。点击textView
上文本区域,控制台会输出Single Tap,说明视图会响应触摸事件。
opaque
不透明的,该属性是BOOL类型,用于确定视图是否不透明。
该属性为绘图系统提供了如何处理视图的提示。如果设置为YES
,绘图系统将视图视为完全不透明,这样可以使绘图系统优化一些绘图操作,并提高性能;如果设置为NO
,则绘图系统会把该视图与其他视图合成,形成最终视图。默认值为YES
。
一个不透明的视图其内容将会是完全不透明,也就是内容的alpha
值应为1.0
。如果视图为部分透明或完全透明,需要把opaque
设为NO
;如果设置为YES
将产生不可预期的结果。
只需要为UIView
的子类在使用drawRect:
方法时设定opaque
属性,opaque
对系统提供的类(如:UIButton、UILabel、UITableViewCell等)没有效果。
hidden
属性是BOOL类型,用于确定视图是否隐藏。设置视图hidden
属性为YES
隐藏视图,设置为NO
显示视图。
被设置为隐藏的视图,会从窗口中消失,不能接收输入事件。但它仍然存在于视图层级中,并像往常一样参与自动布局调整。如果被隐藏的视图有子视图,其子视图也会一起隐藏。
如果被隐藏的视图处于第一响应,则下一有效视图自动成为新的第一响应。
此属性的值仅反映接收者的状态,并不考虑视图层级中父视图的状态。因此,如果视图hidden
属性是NO
,但父视图被隐藏,则该视图仍然被隐藏。
alpha
值为0
、hidden
属性为YES
都可以隐藏视图,其不同之处在于:使用alpha
隐藏视图其过程可以是动画的,而使用hidden
属性则不可以。
参考资料: