iOS—Mask屬性的使用

来源:http://www.cnblogs.com/gardenLee/archive/2016/04/09/5371377.html
-Advertisement-
Play Games

Mask屬性介紹 Mask平時用的最多的是masksToBounds 吧. 其實除此以外Mask使用場景很多,看完之後你會發現好真是好用的不要不要的... 先來瞭解下Mask屬性到底是什麼? Mask 英文解釋是蒙板/面罩,平時我們稱為蒙層. 在蘋果官方文檔里如下圖,意思是Mask是一個可選的Lay ...


Mask屬性介紹

Mask平時用的最多的是masksToBounds 吧. 其實除此以外Mask使用場景很多,看完之後你會發現好真是好用的不要不要的...

先來瞭解下Mask屬性到底是什麼?

Mask 英文解釋是蒙板/面罩,平時我們稱為蒙層. 在蘋果官方文檔里如下圖,意思是Mask是一個可選的Layer,它可以是根據透明度來掩蓋Layer的內容. 

圖1

這麼一說好像...還是不曉得有什麼卵用...

那再看下麵這個說明,意思是Layer的透明度決定了Layer內容是否可以顯示,非透明的內容和背景可以顯示,透明的則無法顯示.

圖2

 

Mask 實例使用

實例1:漸變進度條

先看"臉" 再談"內涵"

 

整個動畫效果主要可以分成4步驟:

1.創建一個CALayer 做為背景色進度條

 1     CALayer *bgLayer = [CALayer layer];
 2 
 3     bgLayer.frame = CGRectMake(kNumberMarkWidth / 2, self.numberMarkView.bottom + 10.f, self.width - kNumberMarkWidth / 2, kProcessHeight);
 4 
 5     bgLayer.backgroundColor = [UIColor colorWithHex:0xF5F5F5].CGColor;
 6 
 7     bgLayer.masksToBounds = YES;
 8 
 9     bgLayer.cornerRadius = kProcessHeight / 2;
10 
11     [self.layer addSublayer:bgLayer];

 

2.創建一個CAGradientLayer 漸變效果的Layer

 1   self.gradientLayer =  [CAGradientLayer layer];
 2     self.gradientLayer.frame = bgLayer.frame;
 3     self.gradientLayer.masksToBounds = YES;
 4     self.gradientLayer.cornerRadius = kProcessHeight / 2;
 5   // 設置漸變顏色數組
 6     [self.gradientLayer setColors:[NSArray arrayWithObjects:
 7                                    (id)[[UIColor colorWithHex:0xFF6347] CGColor],
 8                                    [(id)[UIColor colorWithHex:0xFFEC8B] CGColor],
 9                                    (id)[[UIColor colorWithHex:0xEEEE00] CGColor],
10                                    (id)[[UIColor colorWithHex:0x7FFF00] CGColor],
11                                    nil]];
12   // 設置漸變位置數組
13     [self.gradientLayer setLocations:@[@0.3, @0.5, @0.7, @1]];
14   // 設置漸變開始和結束位置
15     [self.gradientLayer setStartPoint:CGPointMake(0, 0)];
16     [self.gradientLayer setEndPoint:CGPointMake(1, 0)];

 

3.創建一個Mask Layer,並設置為CAGradientLayer漸變層的Mask. 然後通過設置maskLayer 寬度來控制進度了. 是不是很簡單,不過好像沒有感覺不出Mask的強大之處...

1    self.maskLayer = [CALayer layer];
2     self.maskLayer.frame = CGRectMake(0, 0, (self.width - kNumberMarkWidth / 2) * self.percent / 100.f, kProcessHeight);
3     [self.gradientLayer setMask:self.maskLayer];

 

1 - (void)circleAnimation { // 進度條動畫
2     
3     [CATransaction begin];
4     [CATransaction setDisableActions:NO];
5     [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];
6     [CATransaction setAnimationDuration:kAnimationTime];
7     self.maskLayer.frame = CGRectMake(0, 0, (self.width - kNumberMarkWidth / 2) * _percent / 100.f, kProcessHeight);
8     [CATransaction commit];
9 }

 

4.文字漸變,這個就能看出Mask 的特點了.

先創建一個Label展示分數,再同第2步創建一個一樣的漸變CAGradientLayer.將Label的關聯圖層設置為漸變CAGradientLayer 的Mask, 這樣就OK了.

上面有說過Mask屬性特點是內容非透明則可以顯示,透明則隱藏.

實例中,Label做為漸變層的Mask, Label中文字部分是非透明的,其他是透明的.那麼文字和文字背景(這裡就是漸變層)可以顯示.大概就像鏤空文字部分,然後顯示出底下的漸變層.

最後只要移動Label 的位置就能看到我們所要的效果文字顏色漸變. 下左圖設置了Mask , 下右圖未設置Mask.

 

 1 - (void)setNUmberMarkLayer { // 提示文字設置漸變色
 2     
 3     CAGradientLayer *numberGradientLayer = [CAGradientLayer layer];
 4     numberGradientLayer.frame = CGRectMake(0, kTopSpaces, self.width, kNumberMarkHeight);
 5     [numberGradientLayer setColors:self.colorArray];
 6     [numberGradientLayer setLocations:self.colorLocationArray];
 7     [numberGradientLayer setStartPoint:CGPointMake(0, 0)];
 8     [numberGradientLayer setEndPoint:CGPointMake(1, 0)];
 9     [self.layer addSublayer:numberGradientLayer];
10     [numberGradientLayer setMask:self.numberMark.layer];
11     self.numberMark.frame = numberGradientLayer.bounds;
12 }

 

源碼可以進github查看: https://github.com/xl20071926/LXGradientProcessView 

另外還有類似的仿照芝麻信用,用Mask和CAShaperLayer 做的,有興趣的也可以看下:https://github.com/xl20071926/LXCircleAnimationView

 

實例2:鏤空效果

新手引導大多數app都會有這個功能,然而據瞭解蠻多就是直接貼張圖片上面就搞定了.

額,這樣做確實簡單,可是這樣好Low而且做出來的效果不好,那我們來用逼格高點的鏤空方式實現:

先來一個簡單的效果圖:

實現起來也很簡單,主要分3個步驟:

1.創建一個鏤空的路徑:

  UIBezierPath 有個原生的方法- (void)appendPath:(UIBezierPath *)bezierPath, 這個方法作用是倆個路徑有疊加的部分則會鏤空.

  這個方法實現原理應該是path的FillRule 預設是FillRuleEvenOdd(CALayer 有一個fillRule屬性的規則就有kCAFillRuleEvenOdd), 而EvenOdd 是一個奇偶規則,奇數則顯示,偶數則不顯示.疊加則是偶數故不顯示.

2.創建CAShapeLayer 將鏤空path賦值給shapeLayer

3.將shapeLayer 設置為背景視圖的Mask

 1     UIView *backgroundView = [[UIView alloc] init];
 2     backgroundView.frame = self.view.bounds;
 3     backgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7];
 4     [self.view addSubview:backgroundView];
 5     // 創建一個全屏大的path
 6     UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.view.bounds];
 7     // 創建一個圓形path
 8     UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.view.center.x, self.view.center.y - 25)
 9                                                               radius:50
10                                                           startAngle:0
11                                                             endAngle:2 * M_PI
12                                                            clockwise:NO];
13     [path appendPath:circlePath];
14     
15     CAShapeLayer *shapeLayer = [CAShapeLayer layer];
16     shapeLayer.path = path.CGPath;
17     backgroundView.layer.mask = shapeLayer;

順便提下,在實際開發中可能遇到這種需求,當tableView 滑動到某個位置的時候才顯示新手引導.

這時候就需要將tableView上的坐標轉化為相對於屏幕的坐標.  可用原生的方法:

- (CGRect)convertRect:(CGRect)rect toView:(nullable UIView *)view;

- (CGRect)convertRect:(CGRect)rect fromView:(nullable UIView *)view;

 

好了,介紹完畢.

第一次寫博客,玻璃心求輕噴,希望自己能堅持下去,當做一種知識總結也能分享給一些新手朋友們.

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 技術渣,大家將就著看 首先我們需要一個xml數據保存到資料庫,這裡我從QQ下麵找到一個loclist.xml文件 <CountryRegion Name="中國" Code="1"> <State Name="北京" Code="11"> <City Name="東城" Code="1" /> <C ...
  • 演示效果如下: 利用NSURLSession實現斷點下載 1.屬性 2.初始化屬性 3.實現點擊事件 4.實現代理方法 //保存恢複數據 self.resumeData = error.userInfo[NSURLSessionDownloadTaskResumeData]; 怎麼實現的斷點下載? ...
  • 元組(tuples) tuples是將多個單一的值組合為一個複合的值。它可以包含任何類型的值,而不需要都是相同類型。 一.元組的創建 1。 2. 輸出結果 二.元組數據的訪問 1.statusCode,statusMessage就像字典中的key一樣,我們可以通過它們來訪問元祖的元素。 2.還可以使 ...
  • 1.先看看網上流傳的他們的繼承圖: 從上面可以看出CABasicAnimation與CAKeyframeAnimation都繼承於CAPropertyAnimation。而CAPropertyAnimation提供了基本的動畫屬性設置keyPath、additive、cumulative。 2.詳解 ...
  • 一般的手機沒有root許可權,進不去data/data目錄,當手機刷機了後,擁有root許可權,就可以進入data/data目錄,查看我們保存的密碼文件,因此我們需要對存入的密碼進行MD5加密 獲取MessageDigest信息摘要器對象,調用MessageDigest.getInstance(“md5 ...
  • 一直以來,我們把所有的段描述符都放在GDT中,而不管它屬於內核還是用戶程式,為了有效地在任務之間實施隔離,處理器建議每個任務都應當具有自己的描述符表,稱為局部描述符表LDT,並且把專屬於自己的那些段放到LDT中。 和GDT一樣,LDT也是用來存放描述符的。不同之處在於,LDT只屬於某個任務。或者說, ...
  • 原博客地址:http://www.cnblogs.com/tianzhijiexian/p/4161811.html 相信看這篇文章的人都應該知道android中的Dialog了吧,如果對於Dialog還不是很瞭解可以看我之前的一篇詳解文章: Dialog詳解:http://www.cnblogs. ...
  • 跳轉到指定app的實現 IOS中應用的跳轉是通過URL實現的,因此在實現應用跳轉之前我們要設置一下對應的URL。 圖一(尋找配置軟體的URL) 圖二(具體配置選項) 註意: 如果IOS版本為IOS9 我們需要為app設置白名單。 實現跳轉的前提是有這個app,因此我們需要把被跳轉的app先運行,即安 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...