容易忽略的那些小點總結(jié) (一) —— UIView UIViewTintAdjustmentMode相關(guān)(一)

版本記錄

版本號 時間
V1.0 2018.01.21

前言

在蘋果的API文檔中,有很多屬性和方法我們用的不是很多满俗,所以很容易忽略和出錯转捕,下面我就用這一個專題專門說一些不常用的API接口,下面開始唆垃。

UIViewTintAdjustmentMode

這是一個枚舉值五芝,一般很少用到,是iOS 7.0才出現(xiàn)的辕万,下面先看一下這個枚舉枢步。

typedef NS_ENUM(NSInteger, UIViewTintAdjustmentMode) {
    UIViewTintAdjustmentModeAutomatic,
    
    UIViewTintAdjustmentModeNormal,
    UIViewTintAdjustmentModeDimmed,
} NS_ENUM_AVAILABLE_IOS(7_0);

1. 作用

我們先看一個與該枚舉相關(guān)的屬性。

/*
 -tintAdjustmentMode always returns either UIViewTintAdjustmentModeNormal or UIViewTintAdjustmentModeDimmed. The value returned is the first non-default value in the receiver's superview chain (starting with itself).
 If no non-default value is found, UIViewTintAdjustmentModeNormal is returned.
 When tintAdjustmentMode has a value of UIViewTintAdjustmentModeDimmed for a view, the color it returns from tintColor will be modified to give a dimmed appearance.
 When the tintAdjustmentMode of a view changes (either the view's value changing or by one of its superview's values changing), -tintColorDidChange will be called to allow the view to refresh its rendering.
 */
@property(nonatomic) UIViewTintAdjustmentMode tintAdjustmentMode NS_AVAILABLE_IOS(7_0);

tintAdjustmentMode總是返回UIViewTintAdjustmentModeNormal或UIViewTintAdjustmentModeDimmed渐尿。 返回的值
是接收者的超視圖鏈中的第一個非默認(rèn)值(從自身開始)醉途。 如果沒有找到非默認(rèn)值,則返回UIViewTintAdjustmentModeNormal砖茸。
當(dāng)tintAdjustmentMode對于視圖的值為UIViewTintAdjustmentModeDimmed時隘擎,它將從tintColor返回的顏色將被修改為變暗的外觀。
當(dāng)視圖的tintAdjustmentMode改變時(視圖的值改變或者它的一個超視圖值改變)凉夯,將調(diào)用-tintColorDidChange來允許視圖刷新其呈現(xiàn)货葬。

下面我們就說一下該枚舉值的作用采幌,在說明這個枚舉值之前,我們先要看一個屬性震桶,它也是iOS 7.0出現(xiàn)的休傍,定義在UIView的分類UIViewRendering中。

/*
 -tintColor always returns a color. The color returned is the first non-default value in the receiver's superview chain (starting with itself).
 If no non-default value is found, a system-defined color is returned.
 If this view's -tintAdjustmentMode returns Dimmed, then the color that is returned for -tintColor will automatically be dimmed.
 If your view subclass uses tintColor in its rendering, override -tintColorDidChange in order to refresh the rendering if the color changes.

tintColor總是返回一個顏色尼夺。 返回的顏色是接收者父視圖鏈中的第一個非默認(rèn)值(從自身開始)尊残。 如果未找到非默認(rèn)值,則返回系統(tǒng)定義的顏色淤堵。 如果此視圖的
-tintAdjustmentMode返回Dimmed寝衫,則為-tintColor返回的顏色將自動變暗。 如果您的視圖子類在其渲染中使用tintColor拐邪,請覆蓋-tintColorDidChange
以便在顏色更改時刷新渲染慰毅。
 */
@property(null_resettable, nonatomic, strong) UIColor *tintColor NS_AVAILABLE_IOS(7_0);

tintColor這個屬性定義了一個非默認(rèn)的著色顏色值,其值的設(shè)置會影響到以視圖為根視圖的整個視圖層次結(jié)構(gòu)扎阶。它主要是應(yīng)用到諸如app圖標(biāo)汹胃、導(dǎo)航欄、按鈕等一些控件上东臀,以獲取一些有意思的視覺效果着饥。

默認(rèn)情況下,一個視圖的tintColor是為nil的惰赋,這意味著視圖將使用父視圖的tint color值宰掉。當(dāng)我們指定了一個視圖的tintColor后,這個色值會自動傳播到視圖層次結(jié)構(gòu)(以當(dāng)前視圖為根視圖)中所有的子視圖上赁濒。如果系統(tǒng)在視圖層次結(jié)構(gòu)中沒有找到一個非默認(rèn)的tintColor值轨奄,則會使用系統(tǒng)定義的顏色值(藍(lán)色,RGB值為[0,0.478431,1]拒炎,我們可以在IB中看到這個顏色)挪拟。因此,這個值總是會返回一個顏色值击你,即我們沒有指定它玉组。

當(dāng)tintAdjustmentMode屬性設(shè)置為Dimmed時,tintColor的顏色值會自動變暗丁侄。而如果我們在視圖層次結(jié)構(gòu)中沒有找到默認(rèn)值球切,則該值默認(rèn)是Normal。

下面我們還需要看一個方法绒障,這個方法在分類UIViewRendering中。

/*
 The -tintColorDidChange message is sent to appropriate subviews of a view 
when its tintColor is changed by client code or to subviews in the 
view hierarchy of a view whose tintColor is implicitly changed when its 
superview or tintAdjustmentMode changes.

-當(dāng)其tintColor由客戶端代碼改變時捍歪,tintColorDidChange消息被發(fā)送到視圖
的適當(dāng)?shù)淖右晥D户辱;當(dāng)視圖的superview或tintAdjustmentMode更改時鸵钝,
其子視圖的tintColor被隱式地改變,也會受到tintColorDidChange消息庐镐。
 */
- (void)tintColorDidChange NS_AVAILABLE_IOS(7_0);

2. 實例驗證

下面我們就看一下示例驗證恩商。

1)系統(tǒng)默認(rèn)值

我們在自定義視圖中不加入任何控件,先打印出系統(tǒng)默認(rèn)的tintColortintAdjustmentMode必逆,看代碼

#import "JJCustomView.h"

@implementation JJCustomView

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        NSLog(@"self.view.tintColor = %@", self.tintColor);
        NSLog(@"self.view.tintAdjustmentMode = %ld", self.tintAdjustmentMode);
    }
    return self;
}

- (void)tintColorDidChange
{
    NSLog(@"tintColor或者tintAdjustmentMode更改了");
}

@end

下面看輸出結(jié)果

2018-01-21 11:11:43.590710+0800 JJLayer_demo1[1442:123655] self.view.tintColor = UIExtendedSRGBColorSpace 0 0.478431 1 1
2018-01-21 11:11:43.590906+0800 JJLayer_demo1[1442:123655] self.view.tintAdjustmentMode = 1

從這里我們可以看見怠堪,系統(tǒng)默認(rèn)的tintColor是UIExtendedSRGBColorSpace 0 0.478431 1 1,默認(rèn)的tintAdjustmentMode是1名眉,也就是UIViewTintAdjustmentModeNormal粟矿。

2)加控件后的系統(tǒng)默認(rèn)值

我們還是看代碼

#import "JJCustomView.h"

@implementation JJCustomView

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {
        NSLog(@"self.view.tintColor = %@", self.tintColor);
        NSLog(@"self.view.tintAdjustmentMode = %ld", self.tintAdjustmentMode);
        
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(100, 100, 100, 100);
        button.backgroundColor = self.tintColor;
        [self addSubview:button];
        
        UILabel *label = [[UILabel alloc] init];
        label.text = @"tintColor";
        label.frame = CGRectMake(100, 220, 100, 40);
        label.backgroundColor = self.tintColor;
        [self addSubview:label];
    }
    return self;
}

- (void)tintColorDidChange
{
    NSLog(@"tintColor或者tintAdjustmentMode更改了");
}

@end

這里我們將button和label的背景色都設(shè)置為self.tintColor,下面看一下界面效果圖损拢。

3)加控件后的系統(tǒng)Dim樣式

我們還是先看一下代碼陌粹。

#import "JJCustomView.h"

@implementation JJCustomView

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {

        self.tintAdjustmentMode = UIViewTintAdjustmentModeDimmed;
        NSLog(@"self.view.tintColor = %@", self.tintColor);
        NSLog(@"self.view.tintAdjustmentMode = %ld", self.tintAdjustmentMode);
                
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(100, 100, 100, 100);
        button.backgroundColor = self.tintColor;
        [self addSubview:button];
        
        UILabel *label = [[UILabel alloc] init];
        label.text = @"tintColor";
        label.frame = CGRectMake(100, 220, 100, 40);
        label.backgroundColor = self.tintColor;
        [self addSubview:label];
    }
    return self;
}

- (void)tintColorDidChange
{
    NSLog(@"tintColor或者tintAdjustmentMode更改了");
}

@end

下面看輸出結(jié)果

2018-01-21 11:35:53.752995+0800 JJLayer_demo1[1621:152807] tintColor或者tintAdjustmentMode更改了
2018-01-21 11:35:53.754146+0800 JJLayer_demo1[1621:152807] self.view.tintColor = UIExtendedGrayColorSpace 0.484669 0.8
2018-01-21 11:35:53.754314+0800 JJLayer_demo1[1621:152807] self.view.tintAdjustmentMode = 2

下面看一下界面效果

大家可以看見,dim樣式的tintColor值是UIExtendedGrayColorSpace 0.484669 0.8福压,變得更深色了掏秩。

4) 加控件后修改tintColor效果

下面還是看一下代碼

#import "JJCustomView.h"

@implementation JJCustomView

- (instancetype)initWithFrame:(CGRect)frame
{
    if (self = [super initWithFrame:frame]) {

        self.tintColor = [UIColor redColor];
        NSLog(@"self.view.tintColor = %@", self.tintColor);
        NSLog(@"self.view.tintAdjustmentMode = %ld", self.tintAdjustmentMode);
        
        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(100, 100, 100, 100);
        button.backgroundColor = self.tintColor;
        [self addSubview:button];
        
        UILabel *label = [[UILabel alloc] init];
        label.text = @"tintColor";
        label.frame = CGRectMake(100, 220, 100, 40);
        label.backgroundColor = self.tintColor;
        [self addSubview:label];
    }
    return self;
}

- (void)tintColorDidChange
{
    NSLog(@"tintColor或者tintAdjustmentMode更改了");
}

@end

下面看輸出結(jié)果

2018-01-21 11:38:01.505139+0800 JJLayer_demo1[1646:155386] tintColor或者tintAdjustmentMode更改了
2018-01-21 11:38:01.505865+0800 JJLayer_demo1[1646:155386] self.view.tintColor = UIExtendedSRGBColorSpace 1 0 0 1
2018-01-21 11:38:01.506054+0800 JJLayer_demo1[1646:155386] self.view.tintAdjustmentMode = 1

輸出的意思很明確,就不多說了荆姆,直接看一下顯示效果蒙幻。


應(yīng)用場景舉例

  • 如果我們想指定整個App的tint color,則可以通過設(shè)置window的tint color胆筒。這樣同一個window下的所有子視圖都會繼承此tint color邮破。

  • 當(dāng)彈出一個alert或者action sheet時,iOS7會自動將后面視圖的tint color變暗腐泻。此時决乎,我們可以在自定義視圖中重寫tintColorDidChange方法來執(zhí)行我們想要的操作。

參考文章

1. 詳解 UIView 的 Tint Color 屬性
2. Hues, Tints, Tones and Shades: What’s the Difference?
3. iOS7 Day-by-Day :: Day 6 :: Tint Color

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末派桩,一起剝皮案震驚了整個濱河市构诚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌铆惑,老刑警劉巖范嘱,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異员魏,居然都是意外死亡丑蛤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門撕阎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來受裹,“玉大人,你說我怎么就攤上這事∶奕模” “怎么了厦章?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長照藻。 經(jīng)常有香客問我袜啃,道長,這世上最難降的妖魔是什么幸缕? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任群发,我火速辦了婚禮,結(jié)果婚禮上发乔,老公的妹妹穿的比我還像新娘熟妓。我一直安慰自己,他們只是感情好列疗,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布滑蚯。 她就那樣靜靜地躺著,像睡著了一般抵栈。 火紅的嫁衣襯著肌膚如雪告材。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天古劲,我揣著相機(jī)與錄音斥赋,去河邊找鬼。 笑死产艾,一個胖子當(dāng)著我的面吹牛疤剑,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闷堡,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼隘膘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了杠览?” 一聲冷哼從身側(cè)響起弯菊,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎踱阿,沒想到半個月后管钳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡软舌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年才漆,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佛点。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡醇滥,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情腺办,我是刑警寧澤焰手,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站怀喉,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏船响。R本人自食惡果不足惜躬拢,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望见间。 院中可真熱鬧聊闯,春花似錦、人聲如沸米诉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽史侣。三九已至拴泌,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惊橱,已是汗流浹背蚪腐。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留税朴,地道東北人回季。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像正林,于是被迫代替她去往敵國和親泡一。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

推薦閱讀更多精彩內(nèi)容