swift - 使用新的可点击区域和框架创建自定义形状(非矩形)按钮和按钮集
问题描述
我正在创建一个由 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)
}
}
解决方案
推荐阅读
- node.js - 无法安装 MERN 堆栈
- php - 无法从php中的特定目录下载文件
- alexa - 如果您说一个随机单词,为什么不会调用 Fallback Intent?
- python - 过滤器无效:'markdown' django-markdown-deux
- database - postgresql db 表锁定或行锁定多查询执行
- python - 如何生成唯一的 8 位数字,例如帐户 ID(Python、Django)
- mysql - Docker容器中的Mysql从不释放内存并经常崩溃导致内存不足
- c# - 避免在 .NET 核心休息控制器中允许任何大小写的属性名称
- python - 根据字典中列表值的第二项对具有列表作为值的字典列表进行排序
- selenium - 从下拉菜单中选择特定元素 Selenium webdriver