我们新建一个控制器,其view的颜色是怎样的呢?透明的?白色的?黑色的?~
首先来聊聊alpha,我以如下两种alpha作为对比来聊。
一个是UIView的alpha:
UIView *fatherView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];
fatherView.alpha = 1;
其定义如下:
@property(nonatomic) CGFloat alpha; // animatable. default is 1.0
还有一种是颜色的alpha,应用如下:
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
UIView的alpha值会影响到UIView及其所有的subView
alpha是指不透明度,是浮点类型的值,取值范围是0到1.0,表示从完全透明到完全不透明。UIView的alpha值会影响到其所有的subView。
如下面代码:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
UIView *fatherView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];
fatherView.backgroundColor = [UIColor redColor];
[self.view addSubview:fatherView];
NSLog(@"%f, %@", self.view.alpha, self.view.backgroundColor);
NSLog(@"%f, %@", fatherView.alpha, fatherView.backgroundColor);
}
程序运行之后效果如下:
打印结果如下:
2018-01-14 17:32:04.800 View颜色[64795:3502182] 1.000000, UIExtendedGrayColorSpace 1 1
2018-01-14 17:32:04.800 View颜色[64795:3502182] 1.000000, UIExtendedSRGBColorSpace 1 0 0 1
然后我将父视图self.view的不透明度alpha设置成0.5,代码如下:
- (void)viewDidLoad {
[super viewDidLoad];
self.view.backgroundColor = [UIColor whiteColor];
self.view.alpha = 0.5;
UIView *fatherView = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 100, 100)];
fatherView.backgroundColor = [UIColor redColor];
[self.view addSubview:fatherView];
NSLog(@"%f, %@", self.view.alpha, self.view.backgroundColor);
NSLog(@"%f, %@", fatherView.alpha, fatherView.backgroundColor);
}
再次运行后效果如下:
打印结果如下:
2018-01-14 17:32:41.156 View颜色[64814:3503174] 0.500000, UIExtendedGrayColorSpace 1 1
2018-01-14 17:32:41.157 View颜色[64814:3503174] 1.000000, UIExtendedSRGBColorSpace 1 0 0 1
比较两次效果截图不难看出,当父视图的alpha值改变时,加载到该父视图上面的所有的subView都会受到影响。但是subView的alpha值并没有改为父视图的alpha值,subView的背景色的alpha值也没有受到任何影响,这出乎了我的预料,照我目前的知识储备,实在不能理解父视图的alpha值改变是怎样影响到其subView的。各位大神有懂的可以给我留言,不胜感激!~
UIView的alpha和hidden的比较
实际上,将UIView的alpha值设置成0与将UIView的hidden属性值设置成YES,其最终呈现的效果是完全一样的,而且二者都会影响到加载到该控件上的subView。如果我想隐藏某一个View,那么或者将其alpha值设为0,或者直接将其hidden属性值设为YES,不过一般而言我们是将hidden值设为YES来实现隐藏控件,因为设置hidden值的效率更高。
上面提到,将View的alpha值设为0和将其hidden值设为YES都可以隐藏View。无论是采取上述哪种方式,当View被隐藏后,这个View都会被从响应者链条中移除,也就是说这个View都将不再响应事件。
二者并不完全等同,在很久之前我写过的一篇文章iOS 框架之 Core Animation中大致谈了一下隐式动画。alpha就是一个隐式动画属性,当alpha值改变的时候,对应的效果的改变并不是突兀的,而是有一个动画的效果;而hidden值改变的时候,对应的效果的改变并没有动画。
Color的alpha
前面一直在说UIView的alpha,现在聊聊UIView的backgroundColor的alpha。与UIView不同,UIView的backgroundColor的alpha值的改变只影响当前UIView的背景,并不会影响其所有的subView。
clearColor就是将在创建UIColor的时候将其alpha值设置成0(即完全透明)。
一个View,其不透明度的最终展示效果是由该View的alpha和该View的backgroundColor的alpha共同决定的。比如,View的alpha是0.8,View的backgroundColor的alpha是0.5,那么最终的展示效果就是alpha为0.8*0.5=0.4的效果。
控制器的View的颜色
以上都是铺垫,接下来进入今天的正题!~
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
self.window = [[UIWindow alloc] initWithFrame:[UIScreen mainScreen].bounds];
self.window.backgroundColor = [UIColor orangeColor];
NormanViewController *normanVC = [[NormanViewController alloc] init];
self.window.rootViewController = normanVC;
[self.window makeKeyAndVisible];
return YES;
}
如上面代码,NormanViewController是我自定义的一个控制器,新建之后没有做过任何操作,然后我将其设置成应用程序主窗口的根视图控制器,并且我将应用程序的主窗口的背景色设置成橘色。程序运行之后,效果如下:
我发现,现在页面上展示的是应用程序主窗口的背景色,而主窗口上面实际上是有NormanViewController的view的,这说明NormanViewController的view是没有任何颜色的,这种情况有两种可能:要么NormanViewController的view是透明的,要么NormanViewController的view的backgroundColor是透明(即backgroundColor是clearColor)的。下面来分析。
如果NormanViewController的view是透明的,也就是说NormanViewController的view的alpha是0(即NormanViewController的view的hidden值是YES),我在前面已经提到,如果是这种情况,那么添加到NormanViewController的view上的各种控件将都不可响应事件。而我们在日常项目中,新建一个控制器,然后往该控制器的view上面直接添加按钮等控件,都是可以响应事件的,所以说NormanViewController的view的alpha不可能是0。
上面那种情况排除了,那么只能是NormanViewController的view的backgroundColor是透明(即backgroundColor是clearColor)的了。
综上,控制器的View的背景颜色是透明的,但是View本身不是透明的。
以上。
本文分享自微信公众号 - iOS小生活(iOSHappyLife)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
来源:oschina
链接:https://my.oschina.net/u/4581368/blog/4426561