亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS  Mask屬性的詳細介紹及應用實例

2020-07-26 03:06:56
字體:
來源:轉載
供稿:網友

前言:

在開發過程中,類似android和其他平臺的UI開發方法,需要通過一個mask圖顯示部分UI或者Icon資源。ios的控件自帶alpha的值,但是這個值都是整個icon或者UI的透明效果,不能做到自定義的透明或者鏤空效果。我們必須借助于mask資源圖。

Mask屬性介紹

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

先來了解下Mask屬性到底是什么?

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

圖1

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

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

圖2

 

Mask 實例使用

實例1:漸變進度條

先看"臉" 再談"內涵"

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

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

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

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

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

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

 self.maskLayer = [CALayer layer];   self.maskLayer.frame = CGRectMake(0, 0, (self.width - kNumberMarkWidth / 2) * self.percent / 100.f, kProcessHeight);  [self.gradientLayer setMask:self.maskLayer];
- (void)circleAnimation { // 進度條動畫    [CATransaction begin];  [CATransaction setDisableActions:NO];  [CATransaction setAnimationTimingFunction:[CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionEaseInEaseOut]];  [CATransaction setAnimationDuration:kAnimationTime];  self.maskLayer.frame = CGRectMake(0, 0, (self.width - kNumberMarkWidth / 2) * _percent / 100.f, kProcessHeight);  [CATransaction commit];}

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

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

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

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

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

 

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

源碼可以進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

UIView *backgroundView = [[UIView alloc] init];  backgroundView.frame = self.view.bounds;  backgroundView.backgroundColor = [UIColor colorWithWhite:0 alpha:0.7];  [self.view addSubview:backgroundView];  // 創建一個全屏大的path  UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.view.bounds];  // 創建一個圓形path  UIBezierPath *circlePath = [UIBezierPath bezierPathWithArcCenter:CGPointMake(self.view.center.x, self.view.center.y - 25)                               radius:50                             startAngle:0                              endAngle:2 * M_PI                              clockwise:NO];  [path appendPath:circlePath];    CAShapeLayer *shapeLayer = [CAShapeLayer layer];  shapeLayer.path = path.CGPath;  backgroundView.layer.mask = shapeLayer;

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

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

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

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

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品在线91| 精品久久香蕉国产线看观看亚洲| 国产精品一区电影| 欧美精品aaa| 日韩精品久久久久久福利| 日韩一区二区久久久| 国产日本欧美一区| 久久精品国产欧美亚洲人人爽| 成人写真福利网| 日本国产欧美一区二区三区| 日韩av在线免费观看| 亚洲欧美国内爽妇网| 欧美国产精品日韩| 欧美大片大片在线播放| 一个人看的www欧美| 日韩精品视频免费在线观看| 日韩欧美精品在线观看| 日韩精品视频在线观看网址| 日韩精品欧美激情| 日韩欧美亚洲国产一区| 91在线直播亚洲| 国产伦精品一区二区三区精品视频| 亚洲精品美女在线| 精品国产欧美成人夜夜嗨| 一本久久综合亚洲鲁鲁| www.久久草.com| 韩国v欧美v日本v亚洲| 中文在线资源观看视频网站免费不卡| 91亚洲精品久久久| 精品亚洲一区二区| 成人黄色片在线| 欧美巨大黑人极品精男| 欧美日韩成人网| 欧美成人精品三级在线观看| 尤物yw午夜国产精品视频明星| 疯狂做受xxxx高潮欧美日本| 精品调教chinesegay| 在线观看日韩视频| 亚洲精品久久7777777| 国产精品久久久久久久久影视| 日韩福利视频在线观看| 国产亚洲日本欧美韩国| 日韩精品中文字幕在线| 精品亚洲一区二区三区在线观看| 992tv成人免费影院| 亚洲成人在线网| 亚洲一区二区在线播放| 亚洲国产成人精品久久久国产成人一区| 成人国产精品一区| 98精品国产自产在线观看| 国产成人综合一区二区三区| 欧美精品久久久久| 上原亚衣av一区二区三区| 亚洲欧美日韩久久久久久| 高潮白浆女日韩av免费看| 亚洲二区中文字幕| 成人免费视频a| 亚洲一区二区在线| 色偷偷91综合久久噜噜| 亚洲激情小视频| 亚洲最大的免费| 亚洲iv一区二区三区| 国语自产精品视频在线看抢先版图片| 日韩免费精品视频| 777精品视频| 国产91精品网站| 一区二区欧美日韩视频| 疯狂蹂躏欧美一区二区精品| 57pao国产成人免费| 狠狠躁夜夜躁人人爽超碰91| 亚洲iv一区二区三区| 久久久久久久久久国产精品| 久久久999精品免费| 久久国内精品一国内精品| 国产美女久久久| 欧美日韩国产一区在线| 久久久久久久国产精品视频| 日韩精品中文字幕在线观看| 欧美午夜美女看片| 欧美大秀在线观看| 久久久精品影院| 国产成人精品在线视频| 精品国产91久久久久久| 欧美日韩激情视频| 77777亚洲午夜久久多人| 国产伦精品免费视频| 欧美噜噜久久久xxx| 亚洲欧美在线一区二区| 日韩av中文字幕在线免费观看| 亚洲字幕在线观看| 正在播放欧美一区| 国产成人综合精品在线| 国产精品成熟老女人| 国产精品天天狠天天看| 91免费看片网站| 精品国产网站地址| 欧美激情va永久在线播放| 亚洲一区中文字幕在线观看| 亚洲网站在线播放| 欧美高清性猛交| 欧美激情一区二区三区在线视频观看| 亚洲欧美国产精品| 欧美精品久久久久a| 日韩在线视频线视频免费网站| 日韩男女性生活视频| 日韩激情片免费| 久久精品小视频| 日韩欧美精品在线观看| 亚洲成人黄色网址| 亚洲第一免费网站| 亚洲精品欧美一区二区三区| 精品久久久精品| 国产亚洲欧洲黄色| 国产裸体写真av一区二区| 亚洲a区在线视频| 国产欧美欧洲在线观看| 欧美夫妻性生活xx| 国a精品视频大全| 国模极品一区二区三区| 日韩在线观看精品| 色系列之999| 国产精自产拍久久久久久| 91国产视频在线| 色综合久久久888| 亚洲精品国产综合区久久久久久久| 久久成年人视频| 久久久免费在线观看| 国产99视频精品免视看7| 亚洲人午夜精品| 成人免费视频在线观看超级碰| 久久久久久午夜| www.日韩系列| 国产日韩精品在线观看| 久久九九亚洲综合| 亚洲精品狠狠操| 国产精品爽爽爽| 久久免费少妇高潮久久精品99| 欧美性猛交视频| 日韩av手机在线看| 久久久久久中文| 亚洲日本欧美中文幕| 91av视频在线观看| 日韩美女在线看| 欧美视频精品一区| 国产精品日韩欧美大师| 国产精品视频播放| 一区二区三区久久精品| 亚洲精品电影网| 久久天天躁夜夜躁狠狠躁2022| 最近2019中文免费高清视频观看www99| 欧美一级黑人aaaaaaa做受| 最近2019好看的中文字幕免费| 国产精品免费久久久久影院| 日韩视频亚洲视频| 成人免费大片黄在线播放| 日韩在线视频观看正片免费网站| 按摩亚洲人久久| 91亚洲永久免费精品| 精品久久久久久亚洲国产300| 亚洲自拍高清视频网站| 亚洲人成在线免费观看| 国产亚洲精品久久久久动| 亚洲欧美日韩久久久久久| 欧美亚州一区二区三区|