draw不规则 ios_ios canvas.draw不返回 - CSDN
精华内容
参与话题
  • iOS 不规则的ImageView

    千次阅读 2015-01-07 23:11:22
    我们在做iOS开发的时候,往往需要实现不规则形状的头像,如: 那如何去实现? 通常图片都是矩形的,如果想在客户端去实现不规则的头像,需要自己去实现。 1.使用layer去实现, imageView.layer.cornerRadius = 10;...

    我们在做iOS开发的时候,往往需要实现不规则形状的头像,如:


    那如何去实现?

    通常图片都是矩形的,如果想在客户端去实现不规则的头像,需要自己去实现。

    1.使用layer去实现, 见http://blog.csdn.net/johnzhjfly/article/details/39993345

    2.使用CAShapeLayer, CALayer如何去实现

    我们来看看如何使用CAShapeLayer去实现,

    定义一个ShapedImageView,继承于UIView, 代码如下:

    #import "ShapedImageView.h"
    
    @interface ShapedImageView()
    {
        CALayer      *_contentLayer;
        CAShapeLayer *_maskLayer;
    }
    @end
    
    @implementation ShapedImageView
    
    - (instancetype)initWithFrame:(CGRect)frame
    {
        self = [super initWithFrame:frame];
        if (self) {
            [self setup];
        }
        return self;
    }
    
    - (void)setup
    {
        _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];
        
    }
    
    - (void)setImage:(UIImage *)image
    {
        _contentLayer.contents = (id)image.CGImage;
    }
    
    @end
    
    声明了用于maskLayer个CAShapedLayer, CAShapedLayer有个path的属性,将内容Layer的mask设置为maskLayer, 就可以获取到我们想要的形状。

    path我们可以使用CAMutablePath任意的构造,上述的代码运行想过如下:


    如果将代码改成

        _maskLayer = [CAShapeLayer layer];
        _maskLayer.path = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:20].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];
    的效果:

    如果将代码改成:

        CGMutablePathRef path = CGPathCreateMutable();
        CGPoint origin = self.bounds.origin;
        CGFloat radius = CGRectGetWidth(self.bounds) / 2;
        CGPathMoveToPoint(path, NULL, origin.x, origin.y + 2 *radius);
        CGPathMoveToPoint(path, NULL, origin.x, origin.y + radius);
        
        CGPathAddArcToPoint(path, NULL, origin.x, origin.y, origin.x + radius, origin.y, radius);
        CGPathAddArcToPoint(path, NULL, origin.x + 2 * radius, origin.y, origin.x + 2 * radius, origin.y + radius, radius);
        CGPathAddArcToPoint(path, NULL, origin.x + 2 * radius, origin.y + 2 * radius, origin.x + radius, origin.y + 2  * radius, radius);
        CGPathAddLineToPoint(path, NULL, origin.x, origin.y + 2 * radius);
        
        _maskLayer = [CAShapeLayer layer];
        _maskLayer.path = path;
        _maskLayer.fillColor = [UIColor blackColor].CGColor;
        _maskLayer.strokeColor = [UIColor clearColor].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];
    将是这个效果:


    理论上我们可以构造出任意想要的形状,但是有些形状如果你不熟悉几何知识的话是构造不出正确的

    path的,从代码上我们可以看到我们可以通过设置CALayer的contents属性来设置显示的内容,那我们

    是不是可以通过设置CAShapedLayer的contents来设置maskLayer呢?答案是肯定的,代码如下:

        _maskLayer = [CAShapeLayer layer];
        _maskLayer.fillColor = [UIColor blackColor].CGColor;
        _maskLayer.strokeColor = [UIColor clearColor].CGColor;
        _maskLayer.frame = self.bounds;
        _maskLayer.contentsCenter = CGRectMake(0.5, 0.5, 0.1, 0.1);
        _maskLayer.contentsScale = [UIScreen mainScreen].scale;                 //非常关键设置自动拉伸的效果且不变形
        _maskLayer.contents = (id)[UIImage imageNamed:@"gray_bubble_right@2x.png"].CGImage;
        
        _contentLayer = [CALayer layer];
        _contentLayer.mask = _maskLayer;
        _contentLayer.frame = self.bounds;
        [self.layer addSublayer:_contentLayer];
    
    

    gray_bubble_right就是你想要的形状,运行效果如下:

    不停的改变CALayer的一个坏处就是非常的损耗性能,如果你有一个cell的列表,每个列表有个头像的话,快速滑动的时候,你会发现非常的卡。

    此时理想的解决方案是使用CGPath或者UIBezierPath构建不规则的path,然后clip画出来,这里就不详细讲解了。示例代码如下:

    - (UIImage *)maskImage
    {
        // start with an image
        UIImage * fooImage = self;//[UIImage imageNamed:@"foo.png"];
        CGRect imageRect = CGRectMake(0, 0, fooImage.size.width, fooImage.size.height);
        // set the implicit graphics context ("canvas") to a bitmap context for images
        UIGraphicsBeginImageContextWithOptions(imageRect.size, NO, 0.0);
        // create a bezier path defining rounded corners
        UIBezierPath * path = [UIBezierPath bezierPathWithRect:imageRect];
        CGFloat radius = fooImage.size.width / 2.5;
        CGFloat _radius = radius;
        //construct your shaped path
        [path moveToPoint:CGPointMake(0, 0)];
        [path addArcWithCenter:CGPointMake(radius, radius) radius:_radius startAngle:M_PI endAngle:3 * M_PI / 2 clockwise:TRUE];
        [path moveToPoint:CGPointMake(fooImage.size.width, 0)];
        [path addArcWithCenter:CGPointMake(fooImage.size.width - radius, radius) radius:_radius startAngle:3 * M_PI / 2 endAngle:2 * M_PI clockwise:TRUE];
        [path moveToPoint:CGPointMake(fooImage.size.width, fooImage.size.height)];
        [path addArcWithCenter:CGPointMake(fooImage.size.width - radius, fooImage.size.height - radius) radius:_radius startAngle:0 endAngle:M_PI / 2 clockwise:TRUE];
        [path moveToPoint:CGPointMake(0, fooImage.size.height)];
        [path addArcWithCenter:CGPointMake(radius, fooImage.size.height - radius) radius:_radius startAngle:M_PI / 2 endAngle:M_PI clockwise:TRUE];
        path.flatness = 1000;
        path.lineCapStyle = kCGLineCapRound;
        path.lineJoinStyle = kCGLineJoinRound;
        // use this path for clipping in the implicit context
        [path addClip];
        // draw the image into the implicit context
        [fooImage drawInRect:imageRect];
        // save the clipped image from the implicit context into an image
        UIImage *maskedImage = UIGraphicsGetImageFromCurrentImageContext();
        // cleanup
        UIGraphicsEndImageContext();
        return maskedImage;
    }

    源代码

    展开全文
  • ios 自定义不规则按钮

    2018-07-26 10:03:29
    有两种方式,使按钮只在不规则区域有点击事件 1、按钮放图片,取图片的色值,类似PS中的颜色通道,参考:OBShapedButton,调用如下: let button = OBShapedButton() button.frame = CGRect(x: 20, y: 150, ...

    有两种方式,使按钮只在不规则区域有点击事件

    1、按钮放图片,取图片的色值,类似PS中的颜色通道,参考:OBShapedButton,调用如下:

            let button = OBShapedButton()
            button.frame = CGRect(x: 20, y: 150, width: 100, height: 100)
            button.setImage(UIImage(named: "login_logo"), for: .normal)
            button.addTarget(self, action: #selector(onClick), for: .touchUpInside)
            button.backgroundColor = UIColor.red
            self.view.addSubview(button)

    2、自定义按钮,可以通过绘制不规则图形,并将判断不规则区域,通过路径来划分

    
    class CustomButton: UIButton {
    
        private var path: UIBezierPath?
        
        override init(frame: CGRect) {
            super.init(frame: frame)
            //设置背景色为透明,否则是黑色背景
            self.backgroundColor = UIColor.clear
        }
        
        required init?(coder aDecoder: NSCoder) {
            fatalError("init(coder:) has not been implemented")
        }
        
        override func draw(_ rect: CGRect) {
            super.draw(rect)
    
            let finalSize = CGSize(width:self.bounds.size.width, height:self.bounds.size.height)
           
            let layer = CAShapeLayer()
            let bezier = UIBezierPath()
            bezier.move(to: CGPoint(x: finalSize.width/2.0, y: finalSize.height))
            bezier.addArc(withCenter: CGPoint(x: finalSize.width/2.0, y: finalSize.height),
                          radius: 180, startAngle: (CGFloat(M_PI+M_PI_2*2/3.0)), endAngle: (CGFloat(M_PI+M_PI_2 + M_PI_2/3.0)), clockwise: true)
            bezier.addArc(withCenter: CGPoint(x: finalSize.width/2.0, y: finalSize.height),
                          radius: 50, startAngle: (CGFloat(M_PI+M_PI_2 + M_PI_2/3.0)), endAngle: (CGFloat(M_PI+M_PI_2*2/3.0)), clockwise: false)
            bezier.close()
            layer.path = bezier.cgPath
            layer.fillColor = UIColor.black.cgColor
            self.layer.addSublayer(layer)
            self.path = bezier
        }
        
        // 重写点击判定方法
        override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
            if path != nil {
                return path!.contains(point)
            }else {
                return super.point(inside: point, with: event)
            }
        }
    }
    

    调用:

            let v = CustomButton()
            v.backgroundColor = UIColor.blue
            v.frame = CGRect(x: 50, y: 330, width: 200, height: 200)
            v.addTarget(self, action: #selector(onClick), for: .touchUpInside)
            self.view.addSubview(v)
    
    
        @objc func onClick() {
            print("点击了")
        }

     

    展开全文
  • IOS绘制可变多边形

    千次阅读 2016-10-13 14:19:44
    IOS 创建可编辑多边形,基于UIBezierPath  基本功能包括,创建可变三角形,可变四边形,保存,修改,删除 由于项目需要写的一个demo,功能较为单一

    IOS 创建可编辑多边形,基于UIBezierPath 

    基本功能包括,创建可变三角形,可变四边形,保存,修改,删除

    由于项目需要写的一个demo,功能较为单一

    github地址:

    https://github.com/D-oil/ADdrawRect


    展开全文
  • 转载:http://bravoo.diandian.com/   在UIView中绘制直线、矩形、三角形 直线 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 ...

    转载:http://bravoo.diandian.com/

     

    在UIView中绘制直线、矩形、三角形

    直线

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    - (void)drawRect:(CGRect)rect{
        //获得处理的上下文
        CGContextRefcontext = UIGraphicsGetCurrentContext();
        //指定直线样式
        CGContextSetLineCap(context,kCGLineCapSquare);
        //直线宽度
        CGContextSetLineWidth(context,2.0);
        //设置颜色
        CGContextSetRGBStrokeColor(context,0.314, 0.486, 0.859, 1.0);
       //开始绘制
        CGContextBeginPath(context);
        //画笔移动到点(31,170)
        CGContextMoveToPoint(context,31, 70);
        //下一点
        CGContextAddLineToPoint(context,129, 148);
        //下一点
        CGContextAddLineToPoint(context,159, 148);
        //绘制完成
        CGContextStrokePath(context);
    }

    矩形

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    - (void)drawRect:(CGRect)rect{
    //创建路径并获取句柄
    CGMutablePathRef path = CGPathCreateMutable();
    //指定矩形
    CGRect rectangle = CGRectMake(10.0f, 10.0f,200.0f,300.0f);
    //将矩形添加到路径中
    CGPathAddRect(path,NULL,rectangle);
    //获取上下文
    CGContextRef currentContext =UIGraphicsGetCurrentContext();
    //将路径添加到上下文
    CGContextAddPath(currentContext, path);
    //设置矩形填充色
    [[UIColor colorWithRed:0.20f green:0.60f blue:0.80falpha:1.0f]setFill];
    //矩形边框颜色
    [[UIColor brownColor] setStroke];
    //边框宽度
    CGContextSetLineWidth(currentContext,5.0f);
    //绘制
    CGContextDrawPath(currentContext, kCGPathFillStroke);
    CGPathRelease(path);
    }

    三角形

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    - (void)drawRect:(CGRect)rect
    {
        //设置背景颜色
        [[UIColorclearColor]set];
        UIRectFill([selfbounds]);
        //拿到当前视图准备好的画板
        CGContextRefcontext = UIGraphicsGetCurrentContext();
        //利用path进行绘制三角形
        CGContextBeginPath(context);//标记
        CGContextMoveToPoint(context,0, 0);//设置起点
        CGContextAddLineToPoint(context,165, 0);
        CGContextAddLineToPoint(context,165, 105);
        CGContextClosePath(context);//路径结束标志,不写默认封闭
        [[UIColorwhiteColor] setFill]; //设置填充色
        [[UIColorwhiteColor] setStroke]; //设置边框颜色
        CGContextDrawPath(context,kCGPathFillStroke);//绘制路径path
    }

    如需要刷新则调用:setNeedsDisplay方法即可
    展开全文
  • ios 基本图形的绘制

    2015-04-11 14:29:07
    基本图形的绘制 包括: 代码画线,画文字 图片 裁剪 重绘 简单动画 当自定义view的时候 系统会自动调用drawRect 方法 画线 ...- (void)drawRect:(CGRect)rect { // Drawing code // 1....
  • iOS开发笔记--使用blend改变图片颜色

    千次阅读 2016-06-03 17:23:52
    最近对Core Animation和Core Graphics的内容东西比较感兴趣,自己之前也在这块相对薄弱,趁此机会也想补习一下这块的内容,所以...在iOS5和6的SDK里部分标准控件引入了tintColor,来满足个性化界面的需求,但是Appl
  • iOS绘图基础(draw) 先说几个基本概念: context:上下文,ios绘图的方法都需要传一个上下文context,这个context在重写uiview的drawRect的方法里调用UIGraphicsGetCurrentContext()获取 path:路径,ios绘图可以想象...
  • Android & iOS 开发全面对比分析

    万次阅读 2016-08-24 23:27:57
    Android和iOS是移动端的两大平台,Android以它的开源、易上手、开发成本低而受到广大开发者的青睐,而iOS作为苹果的封闭系统,以它的简单、流畅高效、高冷等特点也吸引了一大批果粉开发者,笔者在学校进行了近2年的...
  • ios drawRect绘制图形

    2014-04-24 13:57:15
    0 CGContextRef context = UIGraphicsGetCurrentContext(); 设置上下文 1 CGContextMoveToPoint 开始画线 2 CGContextAddLineToPoint 画直线 4 CGContextAddEllipseInRect 画一椭圆 ...4
  • ios加速计  标签: ios 编程 xcode开发 加速计 杂谈 分类: ios开发   内置加速计是iPhone和iPod Touch中最酷的特性之一,iPhone可以通过这个小设备知道用户握持手机的方式,以及用户是否移动了手机。...
  • 我认为在编码过程中时刻注意性能影响是有必要的,但凡事都有个度,能为了性能耽误了开发进度。在时间紧急的情况下我们往往采用“quick and dirty”的方案来快速出成果,后面再迭代优化,即所谓的敏捷开发。与之相...
  • ios开发图形绘制相关

    千次阅读 2015-06-09 16:15:36
    ios/iphone开发图形绘制,类360扫描效果 http://blog.sina.com.cn/s/blog_68661bd80101nfp1.html IOS用CGContextRef画各种图形(文字、圆、直线、弧线、矩形、扇形、椭圆、三角形、圆角矩形、贝塞尔曲线、图片) ...
  • Draw Call 理解和优化

    万次阅读 2015-03-19 16:32:50
    draw call是openGL的描绘次数(directX没怎么研究,但原理应该差不多) 一个简单的openGL的绘图次序是:设置颜色→绘图方式→顶点座标→绘制→结束。 每帧都会重复以上的步骤。这就是一次draw call如果有两个model...
  • iOS开发工具,ios开发类库

    千次阅读 2018-09-07 08:39:09
    ,iosUI组件介绍,iOS开发常用工具整理,ios开发总结 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SDWebImage多个缩略图缓存组件 UICKeyChainStore存放用户账号密码组件 ...
  • iOS绘图教程

    2016-07-27 11:15:55
    Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎。它提供了低级别、轻量级、高保真度的2D渲染。...iOS开发iOSiOS绘图 本文是《Programming iOS5》中Drawing一章的翻译,考虑到主题
  • DrawCall

    2018-10-21 20:25:38
    在最近,使用U3D开发的游戏核心部分...现在的游戏跑起来会有接近130-170个左右的DrawCall,游戏运行起来明显感觉到卡,而经过一天的优化,DrawCall成功缩减到30-70个,这个效果是非常显著的,并且这个优化并没有通...
1 2 3 4 5 ... 20
收藏数 1,348
精华内容 539
关键字:

draw不规则 ios