【发布时间】:2021-02-27 17:08:00
【问题描述】:
我有一个按钮,里面有一个三角形的图像。如下所示。
这个按钮还有一个三角形的可点击区域。为此,我创建了一个 UIButton 类,如下所示。
按钮的可点击区域是三角形,但按钮的框架仍然是矩形。如何使按钮的框架成为三角形?如果有这样的方式,我不会使用 bezierpath 来绘制可点击区域,因为框架已经是一个三角形。
谢谢。
class triangleShapeButton: UIButton {
private let triangle = UIBezierPath()
override func draw(_ rect: CGRect) {
super.draw(rect)
triangle.move(to: CGPoint(x: rect.width, y: rect.height))
triangle.addLine(to: CGPoint(x:rect.width/2, y: 0))
triangle.addLine(to: CGPoint(x: 0, y:rect.height))
triangle.close()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// This is for allow touches only in shape area.
if triangle.contains(touches.first?.location(in: self) ?? .zero) {
super.touchesBegan(touches, with: event)
}
}
编辑:我要创建的是一个圆形按钮设置如下。在这样做的同时,一些三角形按钮的矩形框架与下一个三角形按钮重叠。这会导致阻止某些三角形按钮的可点击区域。我尝试更改图层层次结构,但至少 1 个按钮仍与另一个按钮重叠。如果我无法更改框架,我该如何解决这个问题?
非常感谢
【问题讨论】:
-
UIBezierPath 中有一个方法
contains(CGPoint)。你可以尝试一次。 developer.apple.com/documentation/uikit/uibezierpath/… -
UIView 的
frame属性始终是CGRect,因此是矩形的。因此,不可能将 UIButton 的框架设置为三角形。但这从一开始就不应该是必要的。正如您已经发现的那样,您可以在矩形框架内绘制一个自定义三角形。 -
感谢您的回答。这意味着很多。 @JoRa 我试图解释的内容对于 cmets 来说太长了,所以我编辑了我的问题,哈哈。你能检查一下吗?谢谢
-
@ChanOnly123 是否有与 contains(CGPoint) 完全相反的方法?像“排除”这样的东西:D我找不到这样的东西。谢谢
-
@matt 在您发表评论后,我进行了一些研究。 hitTest 可能是解决方案。但是 hitTest 需要一个 CGPoint 从可触摸区域中排除。而我需要的是要排除的区域。如何定义要排除的区域(作为 CGPoint)? ++我使用 BezierPath 绘制该区域,并尝试将其从可触摸区域中排除。然后尝试类似: if point != newBezierPath return nil。但那里没有任何改变。接下来我该怎么办?我的问题可能很无知。对不起:)
标签: swift xcode uibutton core-animation uibezierpath