1. alpha
1.1 alpha基本介紹
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];
運行結(jié)果:

在上面的代碼中,我們首先添加一個UIView對象aView到視圖控制器的上半部分,然后在aView中添加UITextView對象textView。設(shè)置aView背景顏色為白色,textView背景顏色為紅色,并設(shè)置textView的alpha值為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
可以看到改變aView的alpha值,子視圖textView的alpha值不會改變。
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è)置aView和textView的alpha值均為0.5,所以視圖最終顯示的alpha值為:0.5*0.5=0.25。
運行結(jié)果如下:

仔細觀察,你會發(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);
運行后顯示如下:

可以看到,子視圖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è)定為零,并添加點擊手勢。運行后如下:

可以看到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");
}
運行后如下圖:

設(shè)置為clearColor的textView沒有顏色,直接透過顯示后面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屬性則不可以。
參考資料: