使用CAShapeLayer實現復雜的View的遮罩效果 .

jopen 8年前發布 | 11K 次閱讀 iOS開發 移動開發

一、案例演示

最近在整理一個聊天的項目的時候,發送圖片的時候,會有一個三角的指向效果,指向這張圖片的發送者。服務端返回給我們的圖片只是一張矩形的圖片,我們如何把一張矩形的圖片或者View,加上一層自定義遮罩效果,就是本文要講的內容。效果演示如下:第一張是一個View的遮罩效果,第二張是UIImageView的遮罩效果。
演示圖片

二、實現機制

在每一View的layer層中有一個mask屬性,他就是專門來設置該View的遮罩效果的。該mask本身也是一個layer層。我們只需要生成一個自定義的layer,然后覆蓋在需要遮罩的View上面即可。問題就歸于如何生成入上圖所示的不規則圖片的Layer。CAShapeLayer可以根據幾個點的依次連線,產生一個閉合空間的layer。如下圖所示:
這里寫圖片描述

三、實現代碼

實現方式為實現了CAShapeLayer的ViewMask的Category。

@implementation CAShapeLayer (ViewMask)

+ (instancetype)createMaskLayerWithView : (UIView *)view{

    CGFloat viewWidth = CGRectGetWidth(view.frame);
    CGFloat viewHeight = CGRectGetHeight(view.frame);

    CGFloat rightSpace = 10.;
    CGFloat topSpace = 15.;

    CGPoint point1 = CGPointMake(0, 0);
    CGPoint point2 = CGPointMake(viewWidth-rightSpace, 0);
    CGPoint point3 = CGPointMake(viewWidth-rightSpace, topSpace);
    CGPoint point4 = CGPointMake(viewWidth, topSpace);
    CGPoint point5 = CGPointMake(viewWidth-rightSpace, topSpace+10.);
    CGPoint point6 = CGPointMake(viewWidth-rightSpace, viewHeight);
    CGPoint point7 = CGPointMake(0, viewHeight);


    UIBezierPath *path = [UIBezierPath bezierPath];
    [path moveToPoint:point1];
    [path addLineToPoint:point2];
    [path addLineToPoint:point3];
    [path addLineToPoint:point4];
    [path addLineToPoint:point5];
    [path addLineToPoint:point6];
    [path addLineToPoint:point7];
    [path closePath];

    CAShapeLayer *layer = [CAShapeLayer layer];
    layer.path = path.CGPath;

    return layer;
}

@end

四、調用方式

    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(40, 50, 80, 100)];
    view.backgroundColor = [UIColor orangeColor];
    [self.view addSubview:view];

    CAShapeLayer *layer = [CAShapeLayer createMaskLayerWithView:view];
    view.layer.mask = layer;

五、聯系方式

微博:新浪微博
博客:http://blog.csdn.net/yixiangboy
github:https://github.com/yixiangboy

來自: http://blog.csdn.net/yixiangboy/article/details/50485250

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!