前言
在APP中我们都有视图透明的逻辑,对于视图透明的逻辑问题不大,但是研究起来也很有意思,视图透明处理起来也要注意,因为它也牵扯到一定的性能和交互的问题。接下来我们就说几种让视图透明的方式。
Hidden
- 默认为NO,就是显示状态
-
hidden
的视图不再接收事件 -
hidden
的视图仍然在父视图的子视图列表里,而且响应自适应autoresizing的事件 -
hidden
的视图所有子视图也会被Hidden而且它们的Hidden属性不会被改变 - 当前的UIView和subview都会被隐藏,而不管subview的hidden值为多少。
- 当前UIView会从响应者链中移除,而响应者链中的下一个会成为第一响应者
Alpha
- 可以当做动画进行动态改变。
-
alpha = 0
时仍旧接收事件,但是这个操作比Hidden
开销大。 - 它对应的
RGB
分量都为0。 - 当alpha < 0.01视图不会响应事件。
下面我们看一下设置视图的alpha对子视图的影响,先看一下代码。
- (void)alphaImpactOnUIView
{
UIView *view = [[UIView alloc] initWithFrame:self.view.frame];
view.backgroundColor = [UIColor redColor];
view.alpha = 0.2;
[self.view addSubview:view];
UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 100.0, 200.0, 150.0)];
subView.backgroundColor = [UIColor yellowColor];
[view addSubview:subView];
}
下面看效果图
image从这里可以看到,我们设置父视图view的alpha为0.2,那么其上面的子视图黄色的那个,也会改变自己的透明度。
那么有没有什么办法可以修改父视图的透明度不影响其子视图的透明度呢?下面我们看一下代码。
- (void)alphaImpactOnUIView
{
UIView *view = [[UIView alloc] initWithFrame:self.view.frame];
view.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
[self.view addSubview:view];
UIView *subView = [[UIView alloc] initWithFrame:CGRectMake(0.0, 100.0, 200.0, 150.0)];
subView.backgroundColor = [UIColor yellowColor];
[view addSubview:subView];
}
下面看一下效果图
image从效果图中我们可以看见view.backgroundColor = [UIColor colorWithWhite:1.0 alpha:0.2];
方法设置的透明度,不会影响其子视图的透明度。
Opaque
- 如果
opaque
设置为YES,那么视图会被当做全视图来对待,系统会重绘整个视图。 - 如果
opaque
设置为NO,那么系统会减少开销,以其中的内容来判定重绘的视图。 - 如果把视图的背景色设置为透明那个,那么opaque最好设置为NO,减少开销。
1. opaque属性对控件可见性的影响
该属性为BOOL值,UIView的默认值是YES,但UIButton等子类的默认值都是NO。opaque表示当前UIView是否不透明,不过搞笑的是事实上它却决定不了当前UIView是不是不透明
,比如你将opaque设为NO,该UIView照样是可见的,是否可见是由alpha
或hidden
属性决定的。
下面看一下代码。
UIView
//opaque对UIView的影响
- (void)opaqueImpactOnUIView
{
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0.0, 100.0, 200.0, 150.0)];
view.backgroundColor = [UIColor yellowColor];
[self.view addSubview:view];
NSLog(@"view.opaque = %d", view.opaque);
view.opaque = NO;
NSLog(@"设置后的view.opaque = %d", view.opaque);
}
下面我们看一下输出结果
2017-12-07 00:09:05.862521+0800 JJAlpha[1052:20536] view.opaque = 1
2017-12-07 00:09:05.862842+0800 JJAlpha[1052:20536] 设置后的view.opaque = 0
从上面我们可以得到几个结论:
- UIView的opaque值默认是YES,意思就是不透明的。
- 即使你将UIView的opaque值设置为NO,视图仍不会不是不透明(意思就是透明),也就是说还是会显示在屏幕,如下图所示。
UIButton
//opaque对UIButton的影响
- (void)opaqueImpactOnUIButton
{
UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
button.frame = CGRectMake(0.0, 100.0, 200.0, 150.0);
button.backgroundColor = [UIColor magentaColor];
[self.view addSubview:button];
NSLog(@"button.opaque = %d", button.opaque);
button.opaque = YES;
NSLog(@"设置后的button.opaque = %d", button.opaque);
}
下面看输出结果
2017-12-07 00:22:18.613542+0800 JJAlpha[1304:29928] button.opaque = 0
2017-12-07 00:22:18.613785+0800 JJAlpha[1304:29928] 设置后的button.opaque = 1
从上面可以得到如下几个结论:
- UIButton的opaque默认为NO,也就是默认是透明的。
- 即使默认是透明的,但是还是会显示出来。如下图所示。
ClearColor
这个也可以使视图的背景色变为透明,等价于alpha = 0,但是这个在性能上不是很好,因为设置透明,就会引起图层的混合,APP要计算其视图以及其后面的视图完成后才会显示。
网友评论