【问题标题】:How do I make a UIImage being drawn with drawInRect using a UIBezierPath?如何使用 UIBezierPath 使用 drawInRect 绘制 UIImage?
【发布时间】:2015-08-07 01:11:46
【问题描述】:

我有一个自定义的UIView 我正在绘制,并且在drawRect 函数中我正在创建一个圆形(中心是空心的,所以画一个甜甜圈)作为UIBezierPath

然后,当我用drawInRect 绘制UIImage 时,我想使用这个UIBezierPath/circle 形状作为遮罩。所以最后我会有一个带有图像背景的甜甜圈形状。

我按如下方式创建圈子/UIBezierPath

let context = UIGraphicsGetCurrentContext()
let progress = CGFloat(1.0)
let diameter = CGFloat(32.0)

let gapExpression: CGFloat = diameter * CGFloat(M_PI)
let dashExpression: CGFloat = progress * diameter * CGFloat(M_PI)

CGContextSaveGState(context)
CGContextTranslateCTM(context, 19, 19)
CGContextRotateCTM(context, -270 * CGFloat(M_PI) / 180)

var circlePath = UIBezierPath()
circlePath.moveToPoint(CGPointMake(-16, 0))
circlePath.addCurveToPoint(CGPointMake(0, -16), controlPoint1: CGPointMake(-16, -8.84), controlPoint2: CGPointMake(-8.84, -16))
circlePath.addCurveToPoint(CGPointMake(16, 0), controlPoint1: CGPointMake(8.84, -16), controlPoint2: CGPointMake(16, -8.84))
circlePath.addCurveToPoint(CGPointMake(0, 16), controlPoint1: CGPointMake(16, 8.84), controlPoint2: CGPointMake(8.84, 16))
circlePath.addCurveToPoint(CGPointMake(-16, 0), controlPoint1: CGPointMake(-8.84, 16), controlPoint2: CGPointMake(-16, 8.84))
circlePath.closePath()
circlePath.lineCapStyle = kCGLineCapRound;

UIColor.grayColor().setStroke()
circlePath.lineWidth = 5
CGContextSaveGState(context)
CGContextSetLineDash(context, 0, [dashExpression, gapExpression], 2)
circlePath.stroke()
CGContextRestoreGState(context)

如果我只是在我的drawRect 中有它,它会输出一个圆形/甜甜圈形状。

不过我也有UIImage

let image = UIImage(named: "test-shape")

我使用drawInRect 绘制,但我希望图像被上面的UIBezierPath 掩盖。

我将如何做到这一点?

【问题讨论】:

    标签: ios uiview core-graphics drawrect


    【解决方案1】:

    保存上下文、添加剪辑、设置比例并绘制图像。

    这应该很接近:

    circlePath.lineCapStyle = kCGLineCapRound;      // existing
    
    // add these lines
    CGContextSaveGState(context)
    circlePath.addClip()
    CGContextScaleCTM(context, 1, -1)
    CGContextDrawTiledImage(context, CGRectMake(0, 0, test-shape.size.width, test-shape.size.height), test-shape.CGImage)
    CGContextRestoreGState(context)
    
    UIColor.grayColor().setStroke()                 //existing
    

    编辑以添加替代:这会绘制一个甜甜圈并用图像填充它。但是破折号可能不会产生您需要的效果。也许这可以在某种程度上有所帮助。

    let context = UIGraphicsGetCurrentContext()
    
    let testshape = UIImage(named: "testshape.png")!
    
    var circlePath = UIBezierPath()
    circlePath.moveToPoint(CGPointMake(9.5, 2.5))
    circlePath.addCurveToPoint(CGPointMake(6.1, 3.38), controlPoint1: CGPointMake(8.27, 2.5), controlPoint2: CGPointMake(7.11, 2.82))
    circlePath.addCurveToPoint(CGPointMake(2.5, 9.5), controlPoint1: CGPointMake(3.95, 4.58), controlPoint2: CGPointMake(2.5, 6.87))
    circlePath.addCurveToPoint(CGPointMake(9.5, 16.5), controlPoint1: CGPointMake(2.5, 13.37), controlPoint2: CGPointMake(5.63, 16.5))
    circlePath.addCurveToPoint(CGPointMake(16.5, 9.5), controlPoint1: CGPointMake(13.37, 16.5), controlPoint2: CGPointMake(16.5, 13.37))
    circlePath.addCurveToPoint(CGPointMake(9.5, 2.5), controlPoint1: CGPointMake(16.5, 5.63), controlPoint2: CGPointMake(13.37, 2.5))
    circlePath.closePath()
    circlePath.moveToPoint(CGPointMake(19, 9.5))
    circlePath.addCurveToPoint(CGPointMake(9.5, 19), controlPoint1: CGPointMake(19, 14.75), controlPoint2: CGPointMake(14.75, 19))
    circlePath.addCurveToPoint(CGPointMake(0, 9.5), controlPoint1: CGPointMake(4.25, 19), controlPoint2: CGPointMake(-0, 14.75))
    circlePath.addCurveToPoint(CGPointMake(3.88, 1.84), controlPoint1: CGPointMake(0, 6.36), controlPoint2: CGPointMake(1.53, 3.57))
    circlePath.addCurveToPoint(CGPointMake(9.5, 0), controlPoint1: CGPointMake(5.45, 0.68), controlPoint2: CGPointMake(7.4, 0))
    circlePath.addCurveToPoint(CGPointMake(19, 9.5), controlPoint1: CGPointMake(14.75, 0), controlPoint2: CGPointMake(19, 4.25))
    circlePath.closePath()
    circlePath.lineCapStyle = kCGLineCapRound;
    
    CGContextSaveGState(context)
    circlePath.addClip()
    CGContextScaleCTM(context, 1, -1)
    CGContextDrawTiledImage(context, CGRectMake(0, 0, testshape.size.width, testshape.size.height), testshape.CGImage)
    CGContextRestoreGState(context)
    

    如果您只想要一个半圆,这里有一个如何绘制它的简单示例。只需将其用作掩码即可。根据需要旋转。

    let color = UIColor(red: 0.742, green: 0.000, blue: 1.000, alpha: 1.000)
    
    var bezierPath = UIBezierPath()
    bezierPath.moveToPoint(CGPointMake(56, 45))
    bezierPath.addCurveToPoint(CGPointMake(31, 70), controlPoint1: CGPointMake(56, 58.81), controlPoint2: CGPointMake(44.81, 70))
    bezierPath.addCurveToPoint(CGPointMake(26, 65), controlPoint1: CGPointMake(28.24, 70), controlPoint2: CGPointMake(26, 67.76))
    bezierPath.addCurveToPoint(CGPointMake(31, 60), controlPoint1: CGPointMake(26, 62.24), controlPoint2: CGPointMake(28.24, 60))
    bezierPath.addCurveToPoint(CGPointMake(46, 45), controlPoint1: CGPointMake(39.28, 60), controlPoint2: CGPointMake(46, 53.28))
    bezierPath.addCurveToPoint(CGPointMake(31, 30), controlPoint1: CGPointMake(46, 36.72), controlPoint2: CGPointMake(39.28, 30))
    bezierPath.addCurveToPoint(CGPointMake(26, 25), controlPoint1: CGPointMake(28.24, 30), controlPoint2: CGPointMake(26, 27.76))
    bezierPath.addCurveToPoint(CGPointMake(29.45, 20.24), controlPoint1: CGPointMake(26, 22.78), controlPoint2: CGPointMake(27.45, 20.9))
    bezierPath.addCurveToPoint(CGPointMake(31, 20), controlPoint1: CGPointMake(29.94, 20.09), controlPoint2: CGPointMake(30.46, 20))
    bezierPath.addCurveToPoint(CGPointMake(56, 45), controlPoint1: CGPointMake(44.81, 20), controlPoint2: CGPointMake(56, 31.19))
    bezierPath.closePath()
    color.setFill()
    bezierPath.fill()
    

    【讨论】:

    • 我这样做了,结果是灰色的圆形边框和圆圈内侧的图像(图像只是一个紫色方块)。这是它的样子:i.imgur.com/bMnnf8p.png,我正在寻找这个:i.imgur.com/SEDdfNT.png,其中紫色被甜甜圈形状所掩盖。
    • 哦,我明白你要做什么了。您尝试使用 LINE 作为掩码。我不认为你能做到这一点。您可能需要在一个圆圈内画一个圆圈并将图像用作填充。让我更新答案...
    • 好吧,对不起。我玩过它,可以让紫色正确填充形状,但是你用破折号做的事情现在显然行不通了。我将它添加到上面的答案中,也许它会有用。
    • 帮了大忙,谢谢!不过我很好奇,如果我只是想用甜甜圈形的圆圈(这是一个进度指示器)用作面具,我是否过于复杂了?有没有更简单的方法可以做到这一点?我不需要用破折号来做所有的事情,如果我能让笔划不一直绕过去(所以它是一个半圆)就可以了!我只是忍不住想我把这件事复杂化了。 :/ (Core Graphics 的新手。)
    • 也许画出你的半圆形,然后根据需要旋转它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-26
    • 2017-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-10-16
    • 1970-01-01
    相关资源
    最近更新 更多