iOS鏤空文字、類歌詞進度顯示文字

整體效果.gif

Demo詳見GitHub:JXTMarkLabel

鏤空文字 - JXTHollowOutLabel

圖層關系.png

鏤空文字效果的實現基于drawRect重繪代虾,具體參考了兩篇帖子:

  1. Drawing a path with subtracted text using Core Graphics
  2. drawRect drawing 'transparent' text?

想了解原理的可以參考原文进肯,根據帖子中提供的代碼,我這里稍作了簡化和封裝棉磨,也就是工程里的JXTHollowOutLabel類江掩。
效果實現的核心代碼如下:

- (void)drawSubtractedText:(NSString *)text inRect:(CGRect)rect inContext:(CGContextRef)context {
    // 將當前圖形狀態(tài)推入堆棧
    CGContextSaveGState(context);
    // 設置混合色
    CGContextSetBlendMode(context, kCGBlendModeDestinationOut);

    // label上面添加label
    UILabel *label = [[UILabel alloc] initWithFrame:rect];
    label.font = _font;
    label.text = text;
    label.textAlignment = NSTextAlignmentCenter;
    label.backgroundColor = _backgroundColor;
    [label.layer drawInContext:context];

    // 把堆棧頂部的狀態(tài)彈出,返回到之前的圖形狀態(tài)
    CGContextRestoreGState(context);
}

該類的調用同系統的UILabel類似(該類是其子類)乘瓤,不過因為封裝的問題环形,初始化僅支持initWithFrame一種,也就是不支持xib馅扣。
再回到文章最開始的話題斟赚,因為有了鏤空文字,這個問題就很簡單了差油,只需要在這個label的底層添加一個可滑動的顏色塊,漸變效果也就有了任洞,效果如下:

漸變效果.gif

如果看得足夠仔細蓄喇,可以發(fā)現有幾個title之間存在很細的裂隙,那是因為我這里的標題的label尺寸是根據文字長短動態(tài)計算的交掏,用了boundingRectWithSize方法妆偏,實際發(fā)現,一旦title的內容是中文和數字或字母混合的盅弛,例如圖中的b站钱骂,就會產生計算誤差,雖然很小挪鹏。见秽。。

基于CoreAnimation的KTV歌詞視圖

  1. iOS歌詞逐漸變色動畫

  2. 基于Core Animation的KTV歌詞視圖的平滑實現

歌詞進度顯示 - JXTProgressLabel

因為沒有像歌詞進度顯示那樣有那么多顧慮讨盒,我這里使用了一種比較白癡的方法解取,這個方法原來是星級評價那里使用的,星級評價就是滿5星返顺,根據數據動態(tài)展示幾點幾星的那個問題禀苦,有的人是直接幾星貼幾張圖,半星就是半顆星的圖遂鹊,但實際上用兩層view再加一層控制的view振乏,一共三層,疊加起來秉扑,就很容易實現這個效果:

歌詞進度顯示.png

上圖中:底層是白色字體的那個label慧邮,也就是backgroundLabel,中間層,也就是現在標示的藍色的透明view赋咽,是clipView旧噪,最上層橙色文字的label,是foregroundLabel脓匿。
三者的層級關系如下:

[self addSubview:self.backgroundLabel];
[self.clipView addSubview:self.foregroundLabel];
[self addSubview:self.clipView];

foregroundLabelclipView的子視圖淘钟,_clipView.clipsToBounds = YES需要設置,此時控制clipView的寬度陪毡,也就控制了foregroundLabel的文字顯示的進度(label的顯示寬度)米母,backgroundLabelclipView是并列關系,后者在前者圖層的上層毡琉,也就展現了背景label隨著中間層clipView的動態(tài)寬度變化铁瞒,從而動態(tài)渲染顏色的視覺假象。星級控制也是同樣的原理桅滋。

JXTProgressLabel的使用也同系統的UIlabel類似慧耍,初始化也僅支持initWithFrame一種,初始化時還需要設置前景和背景label的顏色:

_progressLabel.backgroundTextColor = [UIColor whiteColor];
_progressLabel.foregroundTextColor = [UIColor orangeColor];

控制顯示進度時丐谋,支持兩種方法芍碧,一種是直接控制clipView的寬度,也就是

_progressLabel.clipWidth号俐,但這種方式比較局限泌豆,推薦直接控制

_progressLabel2.dispProgressdispProgress0-1之間的小數吏饿。

JXTProgressLabel除了可以作為類似的歌詞進度顯示踪危,還可以做進度指示器,具體用法看具體需求了猪落。

歌詞進度顯示的升級 - JXTSlideClipLabel

還是回到最開始的問題贞远,如果直接使用之前提到的JXTProgressLabel,很明顯是不能直接滿足需求的许布,因為title的顏色是變過之后兴革,又要變回的,所以蜜唾,上面的JXTProgressLabel的clipView的寬度應該是限定的或者說應該是隨著title長短動態(tài)改變的杂曲,而不是一直增大的。
如果只是限制clipView的寬度袁余,位置水平移動擎勘,很明顯,其子視圖foregroundLabel也會跟著移動颖榜,那么之前動態(tài)渲染的假象也就不復存在了棚饵,這里解決的方法也比較取巧:foregroundLabelframebackgroundLabel一樣煤裙,但是其坐標隨著固定寬度的clipView的移動,反方向退行噪漾,三者之間的圖層關系還是不變的硼砰。

三者圖層關系.png

具體的效果就是最開始的那個展示。
JXTSlideClipLabelDemo中只是原理的封裝欣硼,沒有考慮具體情境而普適题翰,demo中是根據title數量,動態(tài)創(chuàng)建了label诈胜,其實只使用一個label應該也是可以的豹障,只要保證三者的圖層關系就好。只是用一個labelforegroundLabelbackgroundLabel的話焦匈,標題組應該拼接起來成一個字符串血公,具體沒有試,應該是行得通的缓熟。

一種類似視差效果的視圖 - ParallaxView

雖然是這么叫的累魔,但其實不是tableView的那種滑動的視察效果啦,只是不知道該怎么稱呼荚虚,記得是在哪個APP里見過這個效果的

視差效果.gif

這個的實現原理和JXTSlideClipLabel一樣薛夜,可以移動的view中貼了一張大圖,但限于clipView尺寸版述,只能顯示一部分,這一部分根據移動的坐標寞冯,也動態(tài)“退行”渴析,就成了這個效果,好像一塊“透視鏡”吮龄,比較有意思俭茧,那個圓形的本來是想試著做成一個放大鏡的,但是方法后的視圖的坐標變換沒有處理好漓帚,暫時放棄了……
ParallaxView的代碼同樣只是演示母债,滑動視圖的邊界沒有限定,可以自行處理尝抖。


原文鏈接:

iOS 特種label:鏤空文字毡们、類歌詞進度顯示文字

參考文章:

  1. iOS UILabel鏤空特效
  2. Drawing a path with subtracted text using Core Graphics
  3. drawRect drawing 'transparent' text?
  4. RSMaskedLabel
  5. iOS歌詞逐漸變色動畫
  6. 基于Core Animation的KTV歌詞視圖的平滑實現
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市昧辽,隨后出現的幾起案子衙熔,更是在濱河造成了極大的恐慌,老刑警劉巖搅荞,帶你破解...
    沈念sama閱讀 219,589評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件红氯,死亡現場離奇詭異框咙,居然都是意外死亡,警方通過查閱死者的電腦和手機痢甘,發(fā)現死者居然都...
    沈念sama閱讀 93,615評論 3 396
  • 文/潘曉璐 我一進店門喇嘱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人塞栅,你說我怎么就攤上這事者铜。” “怎么了构蹬?”我有些...
    開封第一講書人閱讀 165,933評論 0 356
  • 文/不壞的土叔 我叫張陵王暗,是天一觀的道長。 經常有香客問我庄敛,道長俗壹,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,976評論 1 295
  • 正文 為了忘掉前任藻烤,我火速辦了婚禮绷雏,結果婚禮上,老公的妹妹穿的比我還像新娘怖亭。我一直安慰自己涎显,他們只是感情好,可當我...
    茶點故事閱讀 67,999評論 6 393
  • 文/花漫 我一把揭開白布兴猩。 她就那樣靜靜地躺著期吓,像睡著了一般。 火紅的嫁衣襯著肌膚如雪倾芝。 梳的紋絲不亂的頭發(fā)上讨勤,一...
    開封第一講書人閱讀 51,775評論 1 307
  • 那天,我揣著相機與錄音晨另,去河邊找鬼潭千。 笑死,一個胖子當著我的面吹牛借尿,可吹牛的內容都是我干的刨晴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,474評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼路翻,長吁一口氣:“原來是場噩夢啊……” “哼狈癞!你這毒婦竟也來了?” 一聲冷哼從身側響起帚桩,我...
    開封第一講書人閱讀 39,359評論 0 276
  • 序言:老撾萬榮一對情侶失蹤亿驾,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后账嚎,有當地人在樹林里發(fā)現了一具尸體莫瞬,經...
    沈念sama閱讀 45,854評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡儡蔓,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,007評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了疼邀。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片喂江。...
    茶點故事閱讀 40,146評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖旁振,靈堂內的尸體忽然破棺而出获询,到底是詐尸還是另有隱情,我是刑警寧澤拐袜,帶...
    沈念sama閱讀 35,826評論 5 346
  • 正文 年R本政府宣布吉嚣,位于F島的核電站,受9級特大地震影響蹬铺,放射性物質發(fā)生泄漏尝哆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,484評論 3 331
  • 文/蒙蒙 一甜攀、第九天 我趴在偏房一處隱蔽的房頂上張望秋泄。 院中可真熱鬧,春花似錦规阀、人聲如沸恒序。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,029評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽歧胁。三九已至,卻和暖如春厉碟,著一層夾襖步出監(jiān)牢的瞬間与帆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,153評論 1 272
  • 我被黑心中介騙來泰國打工墨榄, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人勿她。 一個月前我還...
    沈念sama閱讀 48,420評論 3 373
  • 正文 我出身青樓袄秩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親逢并。 傳聞我的和親對象是個殘疾皇子之剧,可洞房花燭夜當晚...
    茶點故事閱讀 45,107評論 2 356

推薦閱讀更多精彩內容

  • 前言 上次有提到最近在封裝的一個控件背稼,這個控件的名字還沒發(fā)現有統一的叫法,安卓里貌似是直接有這個控件的(TabHo...
    霖溦閱讀 13,893評論 48 335
  • 發(fā)現 關注 消息 iOS 第三方庫玻蝌、插件蟹肘、知名博客總結 作者大灰狼的小綿羊哥哥關注 2017.06.26 09:4...
    肇東周閱讀 12,109評論 4 62
  • 六點準時叫醒女兒词疼,好習慣的養(yǎng)成關鍵在于堅持,首先從培養(yǎng)早晨時間綜合利用開始抓起帘腹,養(yǎng)成不拖拉的好習慣贰盗,先讓她自己在沒...
    呂諾爸爸閱讀 221評論 0 2
  • 翻開《人間失格》,會被三張怪異的照片吸引阳欲,再往下便是三篇手記舵盈。 (一)我的感悟 剛開始時看時,我覺得書中那個葉藏分...
    當流云滑過天空閱讀 1,260評論 11 4
  • 讀中學那會球化,正是對愛情懵懂之時秽晚,而偏偏我們的語文老師感情異常豐富,時不時在我們面前談起他的愛妻是如何如何賢惠筒愚,又是...
    隨時隨地寫人生閱讀 586評論 7 15