【发布时间】:2018-03-16 09:35:45
【问题描述】:
已编辑
有关最新项目,请参阅 Nathan 的评论部分。剩下的唯一问题是:获得正确的按钮。
已编辑
我想要一个用户可以旋转的 UIView。该 UIView 应该包含一些可以单击的 UIButton。我遇到了困难,因为我正在使用 UIControl 子类来制作旋转视图,并且在该子类中我必须禁用 UIControl 中子视图上的用户交互(使其旋转),这可能导致 UIButtons 不可点击。如何制作用户可以旋转的 UIView 并且包含可点击的 UIButtons? This 是指向我的项目的链接,它可以让您抢先一步:它包含 UIButtons 和可旋转的 UIView。但是我不能点击 UIButtons。
更多细节的老问题
我正在使用这个 pod:https://github.com/joshdhenry/SpinWheelControl,我想对按钮点击做出反应。我可以添加按钮,但是我无法在按钮中接收点击事件。我正在使用 hitTests 但它们从未被执行。用户应该转动轮子并能够单击其中一个馅饼中的按钮。
在此处获取项目:https://github.com/Jasperav/SpinningWheelWithTappableButtons
查看下面我在 pod 文件中添加的代码:
我在 SpinWheelWedge.swift 中添加了这个变量:
let button = SpinWheelWedgeButton()
我添加了这个类:
class SpinWheelWedgeButton: TornadoButton {
public func configureWedgeButton(index: UInt, width: CGFloat, position: CGPoint, radiansPerWedge: Radians) {
self.frame = CGRect(x: 0, y: 0, width: width, height: 30)
self.layer.anchorPoint = CGPoint(x: 1.1, y: 0.5)
self.layer.position = position
self.transform = CGAffineTransform(rotationAngle: radiansPerWedge * CGFloat(index) + CGFloat.pi + (radiansPerWedge / 2))
self.backgroundColor = .green
self.addTarget(self, action: #selector(pressed(_:)), for: .touchUpInside)
}
@IBAction func pressed(_ sender: TornadoButton){
print("hi")
}
}
这是 TornadoButton 类:
class TornadoButton: UIButton{
override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? {
let pres = self.layer.presentation()!
let suppt = self.convert(point, to: self.superview!)
let prespt = self.superview!.layer.convert(suppt, to: pres)
if (pres.hitTest(suppt)) != nil{
return self
}
return super.hitTest(prespt, with: event)
}
override func point(inside point: CGPoint, with event: UIEvent?) -> Bool {
let pres = self.layer.presentation()!
let suppt = self.convert(point, to: self.superview!)
return (pres.hitTest(suppt)) != nil
}
}
我将此添加到 SpinWheelControl.swift 中,在循环“forwedgeNumber in”中
wedge.button.configureWedgeButton(index: wedgeNumber, width: radius * 2, position: spinWheelCenter, radiansPerWedge: radiansPerWedge)
wedge.addSubview(wedge.button)
这是我认为可以在 SpinWheelControl.swift 中检索按钮的地方:
override open func beginTracking(_ touch: UITouch, with event: UIEvent?) -> Bool {
let p = touch.location(in: touch.view)
let v = touch.view?.hitTest(p, with: nil)
print(v)
}
只有“v”始终是旋转轮本身,而不是按钮。我也看不到按钮打印,并且从未执行过命中测试。这段代码有什么问题,为什么 hitTest 不执行?我宁愿拥有一个普通的 UIBUtton,但我认为我需要为此进行命中测试。
【问题讨论】:
标签: ios swift hittest uicontrol