控制器的View的颜色

吃可爱长大的小学妹 提交于 2020-12-03 07:43:50

我们新建一个控制器,其view的颜色是怎样的呢?透明的?白色的?黑色的?~


首先来聊聊alpha,我以如下两种alpha作为对比来聊。

一个是UIView的alpha:

    UIView *fatherView = [[UIView allocinitWithFrame:CGRectMake(1010100100)];

    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(1010100100)];

    fatherView.backgroundColor = [UIColor redColor];

    [self.view addSubview:fatherView];  


    NSLog(@"%f, %@"self.view.alphaself.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 allocinitWithFrame:CGRectMake(1010100100)];

    fatherView.backgroundColor = [UIColor redColor];

    [self.view addSubview:fatherView];

    NSLog(@"%f, %@"self.view.alphaself.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源创计划”,欢迎正在阅读的你也加入,一起分享。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!