ios - 使用核心图形绘制时如何跳过区域(切口)

原文 标签 ios swift uikit core-graphics

我想画一些项目,但留下一个真正的阿尔法透明的圆形区域的剪贴画。我想实现的目标:
黄色是显示出血的示例背景。
切口宽度实际上比圆弧笔划宽,因此它们不会完全相交。我需要真正的剪纸,因为我保存到一个透明的图像。
我想也许我可以使用setBlendMode(),但我相信只有当我希望我的剪贴画与弧线的宽度完全相同时,这个方法才有效。但我想说的要点是:
随后是一份快速的工作手册。任何关于实现这一点的建议都非常感谢。

import Foundation
import UIKit

var dimen: CGFloat = 200.0;
var strokeWidth: CGFloat = 20.0;
var cutoutWidth: CGFloat = 30.0;

class DonutView : UIView
{
    override func draw(_ rect: CGRect)
    {

        // cutout
        let cutoutColor = UIColor(red: 1, green: 0, blue: 0, alpha: 1)
        cutoutColor.setFill()
        let cutoutPath = UIBezierPath(ovalIn: CGRect(x: dimen-cutoutWidth, y: dimen/2-cutoutWidth/2, width: cutoutWidth, height: cutoutWidth))
        cutoutPath.fill()

//        let context = UIGraphicsGetCurrentContext()!
//        context.setBlendMode(.sourceOut)

        let ringOffset = cutoutWidth/2;
        let circleWidth = dimen - ringOffset*2;

        // ring
        let ringPath = UIBezierPath(ovalIn: CGRect(x: ringOffset, y: ringOffset, width: circleWidth, height: circleWidth))
        let ringColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.3)
        ringColor.setStroke()
        ringPath.lineWidth = strokeWidth
        ringPath.stroke()

        // arc
        let arcRect = CGRect(x: ringOffset, y: ringOffset, width: circleWidth, height: circleWidth)
        let arcPath = UIBezierPath()
        arcPath.addArc(withCenter: CGPoint(x: arcRect.midX, y: arcRect.midY), radius: arcRect.width / 2, startAngle: -90 * CGFloat.pi/180, endAngle: 37 * CGFloat.pi/180, clockwise: true)

        let arcColor = UIColor(red: 0, green: 0, blue: 0, alpha: 0.6)
        arcColor.setStroke()
        arcPath.lineWidth = strokeWidth
        arcPath.stroke()
    }
}

var view = DonutView(frame: CGRect.init(x: 0, y: 0, width: dimen, height: dimen))
view.backgroundColor = UIColor.yellow

// View these elements
view

(编辑:我应该先声明一下:这将最终为WatchKit创建一个UIImage)

最佳答案

在来自的帮助下
子pp

关于ios - 使用核心图形绘制时如何跳过区域(切口),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58063193/

相关文章:

swift - 获取Swift Set中的下一项

ios - 导航栏和表格 View 单元格之间的间距

ios - 如何同时使 UITextView 文本对齐正确和对齐

swift - 如何在Swift 2中没有第三方库的情况下解析JSON数据

ios - 在iOS7中可能对应用程序进行评分和审查?

ios - NSInvalidArgumentException重载UITableView时

objective-c - CALayer是否保留CGColor对象?

iPhone - UIView addSubview Gap 在顶部

ios - 什么时候调用协议(protocol)功能?

ios - cellForRowAtIndexPath调用