作为 iOS 绘图的初学者,我想绘制一个小型工具提示容器,其中包含一个带有指示箭头的矩形。 我创建了 2 个 UIBezierPaths 并使用“appendPath”将它们连接起来。 我认为这是解决这个问题的正确方法,但经过一天的挣扎,我不得不寻求帮助。 这是我现在所在位置的屏幕截图:
正如您所看到的,问题很简单,当我尝试抚摸连接的路径时,它不会作为一个整体被抚摸,而是作为单独的部分被抚摸。 也许有人可以指出我正确的方向来解决这个问题?
这是代码:
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect
{
// create indicator path
UIBezierPath *indicator = [[UIBezierPath alloc] init];
// corner radius
CGFloat radius = self.cornerRadius;
// main path
UIBezierPath *path;
// format frame
rect = CGRectMake(rect.origin.x, rect.origin.y, rect.size.width, rect.size.height - self.indicatorSize.height);
// assign path
path = [UIBezierPath bezierPathWithRoundedRect: rect
byRoundingCorners:UIRectCornerAllCorners
cornerRadii:CGSizeMake(radius, radius)];
// x point
CGFloat x = (rect.size.width - self.indicatorSize.width) / 2;
[indicator moveToPoint:CGPointMake(x, rect.size.height)];
[indicator addLineToPoint:CGPointMake(x + self.indicatorSize.width / 2, rect.size.height + self.indicatorSize.height)];
[indicator addLineToPoint:CGPointMake(x + self.indicatorSize.width, rect.size.height)];
// close path
[indicator closePath];
// append indicator to main path
[path appendPath:indicator];
[[UIColor redColor] setStroke];
[path setLineWidth:2.0];
[path stroke];
[self.fillColor setFill];
[path fill];
// release indicator
[indicator release];
}
提前致谢
您需要将其全部绘制为一条路径,因为此时您告诉它您要绘制整个矩形,然后是三角形,这就是它正在做的事情。
来自 Apple UIBezierPath 文档:
[appendPath:] 将用于在 bezierPath 中创建路径的命令添加到接收者路径的末尾。此方法不会显式尝试连接两个对象中的子路径,尽管 bezierPath 中的操作仍可能会导致这种效果。
所以首先它会绘制你的矩形,然后它会绘制你的三角形而不尝试连接它们
let mergedPaths = CGMutablePath()
mergedPaths.addPath(rectanglePath.cgPath)
mergedPaths.addPath(trianglePath.cgPath)
iOS 16+
let mergedPaths = rectanglePath.cgPath.union(trianglePath.cgPath)