CAShaperLayer處理不規(guī)則圖形

在iOS中總會遇到一些不規(guī)則圖片或者一些圓角設(shè)置的問題,一般情況下我們設(shè)置圓角可以通過layer上來實現(xiàn),

   self.imgview.layer.masksToBounds=YES;
   self.imgview.layer.cornerRadius=10;

但是遇到一些不規(guī)則的我們該怎么處理呢?這個時候我們就需要使用到CaShapeLayer了.
廢話不多說 先上代碼 然后仔細(xì)講解

#import <UIKit/UIKit.h>

@interface WWCustomerView : UIView

@end


#import "WWCustomerView.h"


@interface WWCustomerView()
{
    CALayer* contentLayer;
    CAShapeLayer* maskLayer;
}
@end
@implementation WWCustomerView

-(id)initWithFrame:(CGRect)frame{
    if (self=[super initWithFrame:frame]) {
        
        
        //[self makeContents1];
        
        //[self makeContents2];
        
       // [self makeContents3];
        
        [self makeContents4];
    }
    return self;
}

/**
 正常切割成圓形
 */
-(void)makeContents1
{
    
    maskLayer= [CAShapeLayer layer];
    //路徑
    maskLayer.path=[UIBezierPath bezierPathWithOvalInRect:self.bounds].CGPath;
    
    maskLayer.fillColor=[UIColor blackColor].CGColor;//填充色
    maskLayer.strokeColor=[UIColor redColor].CGColor;
    maskLayer.frame=self.bounds;
    maskLayer.contentsCenter=CGRectMake(0.5, 0.5, 0.1, 0.1);
    maskLayer.contentsScale=[UIScreen mainScreen].scale;
    
    //
    contentLayer=[CALayer layer];
    contentLayer.mask=maskLayer;
    contentLayer.frame=self.bounds;
    
    [self.layer addSublayer:contentLayer];
    
    contentLayer.contents=(__bridge id _Nullable)([UIImage imageNamed:@"2.jpg"].CGImage);
    
}

//切割為圓角  只需要改maskLayer.path部分 的方法
-(void)makeContents2
{
    
    maskLayer= [CAShapeLayer layer];
    //路徑
    //maskLayer.path=[UIBezierPath bezierPathWithOvalInRect:self.bounds:].CGPath;
    
    maskLayer.path=[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:30].CGPath;
    
    maskLayer.fillColor=[UIColor blackColor].CGColor;//填充色
    maskLayer.strokeColor=[UIColor redColor].CGColor;
    maskLayer.frame=self.bounds;
    maskLayer.contentsCenter=CGRectMake(0.5, 0.5, 0.1, 0.1);
    //按比例放大 不變形
    maskLayer.contentsScale=[UIScreen mainScreen].scale;
    
    //
    contentLayer=[CALayer layer];
    contentLayer.mask=maskLayer;
    contentLayer.frame=self.bounds;
    
    [self.layer addSublayer:contentLayer];
    
    contentLayer.contents=(__bridge id _Nullable)([UIImage imageNamed:@"2.jpg"].CGImage);
    
}



/**
 根據(jù)幾何知識規(guī)則 生成不規(guī)則圖形
 */
-(void)makeContents3{
    //生成path
    CGMutablePathRef path =CGPathCreateMutable();
    CGPoint orginPoint=self.bounds.origin;//起點
    CGFloat radius=CGRectGetWidth(self.bounds)/6;//半徑
    
    CGPathMoveToPoint(path, NULL, orginPoint.x, orginPoint.y+5*radius);//左邊直線下點
    
    CGPathMoveToPoint(path, NULL, orginPoint.x, orginPoint.y+radius );//左邊直線上點
    
    
    //2個點 和半徑畫圓弧
    CGPathAddArcToPoint(path,NULL, orginPoint.x, orginPoint.y, orginPoint.x+ radius, orginPoint.y, radius);
    
    CGPathAddArcToPoint(path, NULL, orginPoint.x+5*radius, orginPoint.y, orginPoint.x+5*radius, orginPoint.y+radius, radius);
    
    CGPathAddArcToPoint(path, NULL, orginPoint.x+5*radius, orginPoint.y+5*radius, orginPoint.x+radius, orginPoint.y+2*radius, radius);
    
    CGPathAddLineToPoint(path, NULL, orginPoint.x, orginPoint.y+5*radius);
    
    
    
    
    
    
    maskLayer= [CAShapeLayer layer];
    
//    maskLayer.path=[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:30].CGPath;
    
    maskLayer.path=path;
    
    maskLayer.fillColor=[UIColor blackColor].CGColor;//填充色
    maskLayer.strokeColor=[UIColor redColor].CGColor;
    maskLayer.frame=self.bounds;
    maskLayer.contentsCenter=CGRectMake(0.5, 0.5, 0.1, 0.1);
    //按比例放大 不變形
    maskLayer.contentsScale=[UIScreen mainScreen].scale;
    
    //
    contentLayer=[CALayer layer];
    contentLayer.mask=maskLayer;
    contentLayer.frame=self.bounds;
    
    [self.layer addSublayer:contentLayer];
    
    contentLayer.contents=(__bridge id _Nullable)([UIImage imageNamed:@"2.jpg"].CGImage);
    
}

/**
 可以通過設(shè)置CAShapedLayer的contents來設(shè)置maskLayer
 4png 是一張帶有右邊氣泡尖角的圖片
 */
-(void)makeContents4
{
    maskLayer= [CAShapeLayer layer];
    //路徑
    //maskLayer.path=[UIBezierPath bezierPathWithOvalInRect:self.bounds:].CGPath;
    
    maskLayer.path=[UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:30].CGPath;
    
    maskLayer.fillColor=[UIColor blackColor].CGColor;//填充色
    maskLayer.strokeColor=[UIColor redColor].CGColor;
    maskLayer.frame=self.bounds;
    maskLayer.contentsCenter=CGRectMake(0.5, 0.5, 0.1, 0.1);
    //按比例放大 不變形
    maskLayer.contentsScale=[UIScreen mainScreen].scale;
    
    //
    contentLayer=[CALayer layer];
    contentLayer.mask=maskLayer;
    contentLayer.frame=self.bounds;
    
    [self.layer addSublayer:contentLayer];
    
    contentLayer.contents=(__bridge id _Nullable)([UIImage imageNamed:@"4png"].CGImage);
}

@end

我們自定義了一個繼承于UIView的類WWCustomerView

在類的實現(xiàn)文件中聲明了2個成員變量

 CALayer* contentLayer;
 CAShapeLayer* maskLayer;
    1. 正圓形的圖片
      調(diào)用方法 -(void)makeContents1

      生成的結(jié)果如下 和使用layer 效果是一樣的

1.png
    1. 部分圓角的
      調(diào)用方法
      -(void)makeContents2

生成的結(jié)果如下 和使用layer 效果是一樣的
相比較于方法1 只是修改了利用貝塞爾曲線生成path

 [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:30].CGPath;
2.png
    1. 根據(jù)幾何知識規(guī)則 生成不規(guī)則圖形

      -(void)makeContents3

      生成的結(jié)果如下

3.png
    1. 可以通過設(shè)置CAShapedLayer的contents來設(shè)置maskLayer

      -(void)makeContents4

    生成的結(jié)果如下

4.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末抖部,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子瘟滨,更是在濱河造成了極大的恐慌患久,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件适瓦,死亡現(xiàn)場離奇詭異渣蜗,居然都是意外死亡涤躲,警方通過查閱死者的電腦和手機报嵌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門虱咧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人锚国,你說我怎么就攤上這事腕巡。” “怎么了血筑?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵绘沉,是天一觀的道長煎楣。 經(jīng)常有香客問我,道長车伞,這世上最難降的妖魔是什么转质? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮帖世,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘沸枯。我一直安慰自己日矫,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布绑榴。 她就那樣靜靜地躺著哪轿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪翔怎。 梳的紋絲不亂的頭發(fā)上窃诉,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天,我揣著相機與錄音赤套,去河邊找鬼飘痛。 笑死,一個胖子當(dāng)著我的面吹牛容握,可吹牛的內(nèi)容都是我干的宣脉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼剔氏,長吁一口氣:“原來是場噩夢啊……” “哼塑猖!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起谈跛,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤羊苟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后感憾,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜡励,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年阻桅,在試婚紗的時候發(fā)現(xiàn)自己被綠了巍虫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡鳍刷,死狀恐怖占遥,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情输瓜,我是刑警寧澤瓦胎,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布芬萍,位于F島的核電站,受9級特大地震影響搔啊,放射性物質(zhì)發(fā)生泄漏柬祠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一负芋、第九天 我趴在偏房一處隱蔽的房頂上張望漫蛔。 院中可真熱鬧,春花似錦旧蛾、人聲如沸莽龟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽毯盈。三九已至,卻和暖如春病袄,著一層夾襖步出監(jiān)牢的瞬間搂赋,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工益缠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留脑奠,地道東北人。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓幅慌,卻偏偏與公主長得像捺信,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欠痴,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,916評論 2 344

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