用UIBezierPath数组对UIView进行镂空处理

效果

源码

//
//  CutOutClearView.h
//  CutOutMaskView
//
//  Created by YouXianMing on 16/7/8.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface CutOutClearView : UIView

@property (nonatomic, strong) UIColor  *fillColor;
@property (nonatomic, strong) NSArray  <UIBezierPath *>  *paths;

@end
//
//  CutOutClearView.m
//  CutOutMaskView
//
//  Created by YouXianMing on 16/7/8.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import "CutOutClearView.h"

@implementation CutOutClearView

- (instancetype)initWithFrame:(CGRect)frame {

    if (self = [super initWithFrame:frame]) {

        self.fillColor       = [UIColor whiteColor];
        self.backgroundColor = [UIColor clearColor];
        self.opaque          = NO;
    }

    return self;
}

- (void)drawRect:(CGRect)rect {

    [super drawRect:rect];

    [self.fillColor setFill];
    UIRectFill(rect);

    CGContextRef context = UIGraphicsGetCurrentContext();

    for (UIBezierPath *path in self.paths) {

        CGContextAddPath(context, path.CGPath);
        CGContextSetBlendMode(context, kCGBlendModeClear);
        CGContextFillPath(context);
    }
}

@end
//
//  ViewController.m
//  CutOutClearView
//
//  Created by YouXianMing on 16/7/8.
//  Copyright © 2016年 YouXianMing. All rights reserved.
//

#import "ViewController.h"
#import "CutOutClearView.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {

    [super viewDidLoad];

    UIImageView *imageView = [[UIImageView alloc] initWithFrame:self.view.bounds];
    imageView.image        = [UIImage imageNamed:@"bg.png"];
    imageView.contentMode  = UIViewContentModeScaleAspectFill;
    [self.view addSubview:imageView];

    NSMutableArray *paths = [NSMutableArray array];

    {
        UIBezierPath* bezierPath = [UIBezierPath bezierPath];
        [bezierPath moveToPoint: CGPointMake(57.04, 31.19)];
        [bezierPath addLineToPoint: CGPointMake(125.55, 12.5)];
        [bezierPath addLineToPoint: CGPointMake(185.5, 91)];
        [bezierPath addLineToPoint: CGPointMake(57.04, 169.5)];
        [bezierPath addLineToPoint: CGPointMake(18.5, 91)];
        [bezierPath addLineToPoint: CGPointMake(57.04, 31.19)];
        [bezierPath closePath];
        [paths addObject:bezierPath];
    }

    {
        UIBezierPath* bezierPath = [UIBezierPath bezierPath];
        [bezierPath moveToPoint: CGPointMake(46.5, 245.5)];
        [bezierPath addLineToPoint: CGPointMake(137.5, 272.5)];
        [bezierPath addLineToPoint: CGPointMake(137.5, 211.5)];
        [bezierPath addLineToPoint: CGPointMake(90.5, 196.5)];
        [bezierPath addLineToPoint: CGPointMake(46.5, 211.5)];
        [bezierPath addLineToPoint: CGPointMake(46.5, 245.5)];
        [bezierPath closePath];
        [paths addObject:bezierPath];
    }

    CutOutClearView *cutOutView = [[CutOutClearView alloc] initWithFrame:self.view.bounds];
    cutOutView.fillColor        = [UIColor redColor];
    cutOutView.paths            = paths;
//    [self.view addSubview:cutOutView];
    imageView.maskView = cutOutView;
}

@end

细节

时间: 2024-12-21 18:56:13

用UIBezierPath数组对UIView进行镂空处理的相关文章

ios 继承UIView实现自定义视图——实现画图

主要的原理包括: 继承UIView ,重载drawrect和重载触摸事件 待实现的功能还有,路径数组保存等. 用可变数据保存path路径 画曲线是通过二次贝塞尔曲线实现的 这里可以得到画图的UIImage对象 UIGraphicsBeginImageContext(self.bounds.size); [self.layer renderInContext:UIGraphicsGetCurrentContext()]; UIImage *result=UIGraphicsGetImageFrom

读取svg图片为UIBezierPath,开心做动画

动画预览 先扯淡 最近手痒又想整点动画玩玩,但是想了几个主意发现稍微复杂一点的手写都一定会累爆.这篇文章记录一下今天折腾的一个方案.说来简单,就是用矢量设计工具舒舒服服的做好设计,然后输出成 svg 格式,再用 NSXMLParser 去读出来,转换成 UIBezierPath ,然后就天高任鸟飞- 清晰起见,这里不使用各种库,由上面的二维码动画为例,只转换最简单的矩形.需要更多高能操作的,出门右转 SVGKit 开工 筹备材料先,首先找个能提供 svg 格式下载的二维码生成网站,比如 这个 .

UIView全部API的学习。

/********* UIView是iOS系统界面元素的基础,所有的界面元素都是集成自它.它本身完全是由CoreAnimation来实现的.它真正的绘图部分,是一个叫CALayer(Core Animation Layer)的类来管理的.UIView本身,更像是一个CALayer的管理器 ,访问它的跟绘图和跟坐标有关的属性,例如frame,bounds等等,实际上内部都是在访问它所包含的CALayer的相关属性 *********/ //1.View设置动画块中的动画属性变化的曲线 typede

CALayer与UIBezierPath

UIView继承于UIResponder CALayer继承于nsobject 创建UIView创建一个layer,通过UIView的layer属性可依访问它的图层.UIView具有事件处理功能,可以与用户交互,layer负责显示和动画任务. 要显示一个UIView,会自动调用起drawRect方法绘画所有内容,然后字啊将图层拷贝到屏幕上,完成UICView的显示. frame不能作动画  修改大小bounds  修改位子position CALayer不能直接使用UIColer.UIImage

UIView / &#160;UIView的布局

//! 一个视图可以有n个子视图,但是一个视图只能有一个父视图 struct CGRect {   CGPoint origin;   CGSize size; }; CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height) {   CGRect rect;   rect.origin.x = x; rect.origin.y = y;   rect.size.width = width; rect.size.height =

Objective - C学习笔记:UIView的使用方法

1.1 - (void)layoutSubviews; * 当一个控件的frame发生改变的时候就会自动调用 * 一般在这里布局内部的子控件(设置子控件的frame) * 一定要调用super的layoutSubviews方法 1.2 - (void)didMoveToSuperview; * 当一个控件被添加到父控件中就会调用 1.3 - (void)willMoveToSuperview:(UIView *)newSuperview; * 当一个控件即将被添加到父控件中会调用 @interf

&lt;iOS小技巧&gt;UIview指定设置控件圆角

一.用法: 众所周知,设置控件的圆角使用layer.cornerRadius属性即可,但是这样设置成的结果是4个边角都是圆角类型. 利用班赛尔曲线画角: //利用班赛尔曲线画角 UIBezierPath *bezierPath = [UIBezierPath bezierPathWithRoundedRect:button.bounds byRoundingCorners:(UIRectCornerBottomLeft |UIRectCornerBottomRight) cornerRadii:

GIF动画,菊花动画,UIView动画,CoreAnimation动画(CALayer动画)的用法

1.GIF动画 1 // 创建一个显示图片的imageView // viewController创建 2 UIImageView *showGifImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 414, 736)]; 3 [self.view addSubview:showGifImageView]; 4 5 6 //创建一个存储图片的数组 7 NSMutableArray *saveImageViewArray

IOS开发-UIView之动画效果的实现方法(合集)

http://www.cnblogs.com/GarveyCalvin/p/4193963.html 前言:在开发APP中,我们会经常使用到动画效果.使用动画可以让我们的APP更酷更炫,最重要的是优化用户体验,但取决于动画的质量.像QQ.微信.新浪微博等APP,动画效果就很好了,至少我很喜欢它们的动画,让我使用起来感觉很顺畅,心情很开朗.本文会介绍UIView效果的实现方法,非核心动画. 一.使用UIView类实现动画 基本写法,代码必须放在Begin和Commit之间: [UIView beg