【发布时间】:2023-04-09 02:37:01
【问题描述】:
我想在 tableView 上应用带有模糊的UIEffectView,但每个单元格中都有圆形的UIImageView 对象显示出来。我使用了一个蒙版并调整了this answer 的解决方案,以创建一种可以迭代地在每个单元格上方切割出圆圈的方法:
func cutCircle(inView view: UIView, rect1: CGRect, rect2: CGRect?) {
// Create new path and mask
let newMask = CAShapeLayer()
// Create path to clip
let newClipPath = UIBezierPath(rect: view.bounds)
let path1 = UIBezierPath(ovalIn: rect1)
newClipPath.append(path1)
if let rect2 = rect2 {
let path2 = UIBezierPath(ovalIn: rect2)
//FIXME: Need a way to get a union of both paths!
//newClipPath.append(path2)
}
// If view already has a mask
if let originalMask = view.layer.mask, let originalShape = originalMask as? CAShapeLayer, let originalPath = originalShape.path {
// Create bezierpath from original mask's path
let originalBezierPath = UIBezierPath(cgPath: originalPath)
// Append view's bounds to "reset" the mask path before we re-apply the original
newClipPath.append(UIBezierPath(rect: view.bounds))
// Combine new and original paths
newClipPath.append(originalBezierPath)
}
// Apply new mask
newMask.path = newClipPath.cgPath
newMask.fillRule = .evenOdd
view.layer.mask = newMask
}
在 UIEffectView 上为每个可见的 tableview 单元格调用此函数:for cell in tableView.visibleCells()。它会在掩码上附加一个新圆圈。
但是,有些项目有一个较小的圆圈图标叠加层,如下所示:
我在上面的方法中添加了第二个CGRect参数来有条件地剪掉这个圆圈。但是,蒙版在两个圆圈重叠的地方保持不变,如下所示:
我在这里查看了一些答案,因为我需要找到一种方法来合并两个 UIBezierPath 对象。然而,事实证明这非常困难。我不认为我可以使用绘图上下文,因为这是 UIEffectView 并且需要迭代地剪切蒙版。
我尝试更改填充规则(.evenOdd、.nonZero),但这并没有达到预期的效果。
有没有什么技巧可以将两个重叠的UIBezierPath 组合成一个蒙版?
总体目标是通过连续的tableview单元格来实现这种效果,但是有些图标会有额外的圆圈。
注意底部图标有多余的圆圈,但它被裁剪了,而我目前剪掉这个多余圆圈的技术会导致上面提到的问题,其中重叠没有按预期屏蔽。
【问题讨论】:
-
这是一段视频,展示了效果的当前状态并演示了底部图标第二个圆圈的问题:dropbox.com/s/lvjhf6okgr6n3vn/IMG_3903.TRIM.MOV?raw=1
-
您不能使用 addArcWithCenter 方法绘制两条弧线并将它们组合成一个 UIBezierpath 吗?
-
@TibinThomas 谢谢你。几分钟前我刚刚遇到了弧贝塞尔路径方法,圆圈的交点很容易找到。我将如何使用这种方法?我需要知道交点外两个圆的弧角吗?
-
是的,您需要两个圆的确切半径以及两个圆的确切起点和终点角度,以便两条合并的弧形成您想要的单一形状。如果圆的大小恒定这可能很容易计算。
-
@TibinThomas 是的,圆圈是不变的。较大的一个半径为 25pt,较小的一个半径为 10pt,并与包围较大圆圈的正方形的右下角对齐。您能否提交一个链接两个弧的演示,因为我认为这可能是我正在寻找的。span>
标签: ios swift uibezierpath uiblureffect