• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ios - 在drawRect内绘制透明的UIBezierPath线

[复制链接]
菜鸟教程小白 发表于 2022-12-12 10:46:59 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

我正在尝试在 drawRect 方法中实现透明路径。这是我创建的简单代码:

override func drawRect(rect: CGRect) {
    let clippingPath = UIBezierPath()

    UIColor.whiteColor().set();
    clippingPath.moveToPoint(CGPoint(x: 10, y: CGRectGetHeight(self.bounds) / 2))
    clippingPath.addLineToPoint(CGPoint(x: CGRectGetWidth(self.bounds) - 10, y: CGRectGetHeight(self.bounds) / 2))
    clippingPath.lineWidth = 6
    clippingPath.lineCapStyle = .Round
    clippingPath.stroke()
}

结果如下:

enter image description here

有没有办法让背景保持实心但路径线透明。如果我将第二行更改为 UIColor.clearColor().set() 似乎什么也没发生,我只会得到一个完整的纯色背景色(在这种情况下为黑色。



Best Answer-推荐答案


您想用 kCGBlendModeDestinationOut 的混合模式(和纯色笔触)绘制路径。

According to the docs ,此混合模式执行以下操作:

R = D*(1 - Sa)

在哪里...

  • R 是预乘结果。

  • S 是源颜色,包括 alpha

  • D 是目标颜色,包括 alpha

  • Ra、Sa 和 Da 是 R、S 和 D 的 alpha 分量

这样,当与纯色笔触一起使用时,绘制的路径将是“透明的”。

clearColor 对您不起作用的原因是因为默认混合模式是 additive,因此生成的颜色不会受到绘制带有 alpha 的颜色的影响0 在它上面。另一方面,DestinationOut减法

因此您需要执行以下操作:

override func drawRect(rect: CGRect) {

    let clippingPath = UIBezierPath()

    let context = UIGraphicsGetCurrentContext() // get your current context

    // draw your background color
    UIColor.greenColor().set();
    CGContextFillRect(context, bounds)

    CGContextSaveGState(context) // save the current state

    CGContextSetBlendMode(context, .DestinationOut) // change blend mode to DestinationOut (R = D * (1-Sa))

    // do 'transparent' drawing

    UIColor.whiteColor().set();
    clippingPath.moveToPoint(CGPoint(x: 10, y: CGRectGetHeight(self.bounds) / 2))
    clippingPath.addLineToPoint(CGPoint(x: CGRectGetWidth(self.bounds) - 10, y: CGRectGetHeight(self.bounds) / 2))
    clippingPath.lineWidth = 6
    clippingPath.lineCapStyle = .Round
    clippingPath.stroke()

    CGContextRestoreGState(context) // restore state of context

    // do further drawing if needed
}

注意:

您必须将 View 的 opaque 属性设置为 false 才能正常工作,否则 UIKit 将假定它具有不透明的内容。例如:

override init(frame: CGRect) {
    super.init(frame: frame)
    opaque = false
}

关于ios - 在drawRect内绘制透明的UIBezierPath线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35724906/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap