如何解决使用新的可点击区域和框架创建自定义形状非矩形按钮和按钮集
我正在创建一个圆形按钮集,它由 6 个三角形按钮组成,如下所示。
每个三角形都是一个不同的按钮。 为了创建该圆形,我在每个三角形按钮的顶部创建了 6 个不同层,并通过连续添加 +60 度来旋转它们中的每一个(详细说明如下)。由于旋转发生在 viewdidload 中,如果不启动模拟器,我无法获得这个圆形。
三角形按钮如下所示,无需启动模拟器。我知道它看起来像一个三角形按钮,但它下面还有 5 个相同的按钮(总共 6 个按钮)。为了给它们圆形,我通过添加 60 度旋转每个。(还有一个锚点)
所以第一张图片旋转了 0 度,第二张是 60 度,第三张是 120 度,依此类推.. 这就是我用三角形按钮获得圆形的方法。
我还为每个三角形设置了三角形可点击区域(通过使用 BezierPath),因此只有三角形图像可点击。但是按钮的框架仍然是矩形的,如下所示。
我的问题是,当我得到圆形时,最后一个三角形的框架与第一个按钮重叠。所以即使可点击区域是三角形,由于框架(它是矩形),它也会阻止靠近它的按钮的可点击区域。有什么可能的方法可以将按钮的框架裁剪为我想要的自定义形状?或者它总是必须是矩形?我如何解决由于圆形而导致重叠帧的问题?
我对任何类型的解决方案持开放态度,即使是以另一种方式创建圆形按钮集。
我的代码块如下。
代码:
带有新锚点的旋转函数:
func rotateButton(button : UIButton,angle : Double) {
button.setAnchorPoint(CGPoint(x: 1,y: 1))// setting new anchor
button.transform = CGAffineTransform(rotationAngle: CGFloat(angle * Double.pi/180))
}
将每个三角形按钮的旋转角度增加 60 度:
for buttons in buttonArray {
rotateButton(button: buttons,angle: degree)
degree = degree + 60
}
为按钮设置三角形的可点击区域类(然后将按钮的类设置为这个新类):
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)
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。