alpha、clearColor、opaque、hidden你能分清嗎

1. alpha

1.1 alpha基本介紹

alpha屬性值為浮點類型,范圍是0.01.0,0.0代表完全透明,1.0代表完全不透明。

下圖顯示了大矩形alpha值分別為1.0、0.75、0.5、0.1、0.0時的情況:

AlphaAll.png

下面,我們通過一段代碼看下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];

運行結(jié)果:

AlphaInitial.png

在上面的代碼中,我們首先添加一個UIView對象aView到視圖控制器的上半部分,然后在aView中添加UITextView對象textView。設(shè)置aView背景顏色為白色,textView背景顏色為紅色,并設(shè)置textViewalpha值為0.25。在運行結(jié)果中我們可以看到alpha不僅影響視圖的backgroundColor,也會影響視圖上的文字。

1.2 改變父視圖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.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

可以看到改變aViewalpha值,子視圖textViewalpha值不會改變。

1.3 改變父視圖alpha的值,子視圖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.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);

上面代碼里設(shè)置aViewtextViewalpha值均為0.5,所以視圖最終顯示的alpha值為:0.5*0.5=0.25。

運行結(jié)果如下:

AlphaMultiply.png

仔細觀察,你會發(fā)現(xiàn)該視圖顯示效果與1 中的視圖顯示效果一致,均為0.25。但是視圖本身的alpha值并沒有被改變,控制臺輸出結(jié)果如下所示:

aView alpha is:0.500000
textView alpha is:0.500000

1.4 如果只想設(shè)定視圖背景顏色的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);

運行后顯示如下:

AlphaRGBA.png

可以看到,子視圖textView的顯示完全不受影響??刂婆_輸出結(jié)果為:

aView alpha is:1.000000
textView alpha is:1.000000

1.5 當alpha為零時,視圖將完全不可見,且不能響應觸摸事件。

更新代碼如下:

- (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設(shè)定為零,并添加點擊手勢。運行后如下:

AlphaZero.png

可以看到textView視圖和文本都沒有顯示,且點擊CGRectMake(50, 50, 100, 100)區(qū)域,控制臺沒有任何輸出。

事實上,iOS上不可見的視圖均不可響應事件。

另外,改變alpha值的過程也可以使用動畫。

2. clearColor

backgroundColor是出現(xiàn)在UIView背面顏色的特殊色調(diào),clearColor的grayscale和alpha值都是0.0,即沒有背景顏色,像玻璃一樣可以透過當前視圖顯示下面視圖。

- (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;   // 即不設(shè)置背景顏色。
    [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");
}

運行后如下圖:

AlphaclearColor.png

設(shè)置為clearColortextView沒有顏色,直接透過顯示后面aView視圖的顏色,所以clearColor就像一層玻璃。另外clearColor視圖上的文字是可見的。點擊textView上文本區(qū)域,控制臺會輸出Single Tap,說明視圖會響應觸摸事件。

backgroundColor默認值是nil,這時視圖也是透明的背景顏色,但其與clearColor不同。textView背景色為nil時,使用NSLog(@"%@",textView.backgroundColor)輸出,控制臺輸出為(null);textView背景色為clearColor時,使用NSLog(@"%@",textView.backgroundColor)輸出,控制臺輸出為UIExtendedGrayColorSpace 0 0

3. opaque

opaque不透明的,該屬性是BOOL類型,用于確定視圖是否不透明。

該屬性為繪圖系統(tǒng)提供了如何處理視圖的提示。如果設(shè)置為YES,繪圖系統(tǒng)將視圖視為完全不透明,這樣可以使繪圖系統(tǒng)優(yōu)化一些繪圖操作,并提高性能;如果設(shè)置為NO,則繪圖系統(tǒng)會把該視圖與其他視圖合成,形成最終視圖。默認值為YES。

一個不透明的視圖其內(nèi)容將會是完全不透明,也就是內(nèi)容的alpha值應為1.0。如果視圖為部分透明或完全透明,需要把opaque設(shè)為NO;如果設(shè)置為YES將產(chǎn)生不可預期的結(jié)果。

只需要為UIView的子類在使用drawRect:方法時設(shè)定opaque屬性,opaque對系統(tǒng)提供的類(如:UIButton、UILabel、UITableViewCell等)沒有效果。

4. hidden

hidden屬性是BOOL類型,用于確定視圖是否隱藏。設(shè)置為YES時,隱藏視圖;設(shè)置為NO時,顯示視圖。

被設(shè)置為隱藏的視圖,會從窗口中消失,不能接收輸入事件。但它仍然存在于視圖層級中,并像往常一樣參與自動布局調(diào)整。如果被隱藏的視圖有子視圖,其子視圖也會一起隱藏。

如果被隱藏的視圖處于第一響應,則下一有效視圖自動成為新的第一響應。

此屬性的值僅反映接收者的狀態(tài),并不考慮視圖層級中父視圖的狀態(tài)。因此,如果視圖hidden屬性是NO,但父視圖被隱藏,則該視圖仍然被隱藏。

alpha值為0、hidden屬性為YES都可以隱藏視圖,其不同之處在于:使用alpha隱藏視圖其過程可以是動畫的,而使用hidden屬性則不可以。

參考資料:

  1. UIView alpha vs. UIColor alpha
  2. What is the impact of view.alpha = 0 vs view.hidden = YES?
  3. opaque
  4. alpha
  5. hidden

歡迎更多指正:https://github.com/pro648/tips/wiki

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

  • 1、設(shè)置UILabel行間距 NSMutableAttributedString* attrString = [[...
    十年一品溫如言1008閱讀 2,029評論 0 3
  • 一、初始化方法 1、- initWithFrame: UIView *view = [[UIView alloc]...
    默默_David閱讀 2,714評論 1 3
  • Core Animation基礎(chǔ) Core Animation 利用了硬件加速和架構(gòu)上的優(yōu)化來實現(xiàn)快速渲染和實時動...
    獨木舟的木閱讀 1,695評論 0 3
  • 周圍的人都很優(yōu)秀,看了禪道這本書,被別人說成成功學這種毫無邏輯作用的書,小生氣,自己覺得挺有用的書被別人說成是……...
    6186834d3810閱讀 426評論 0 1
  • 今天他發(fā)了工資。他為自己斟上從超市買來的紅酒,滿滿一杯,然后小心翼翼地嘬了一口,怕溢出來。他打開手機隨手播放了一首...
    唐黃閱讀 379評論 0 2

友情鏈接更多精彩內(nèi)容