Отредактировано
См. Раздел комментариев с Натаном, чтобы узнать о последнем проекте. Остается только проблема: получить нужную кнопку.
Отредактировано
Я хочу иметь UIView, который пользователь может вращать. Этот UIView должен содержать несколько кнопок UIButton, которые можно щелкнуть. Мне трудно, потому что я использую подкласс UIControl для создания вращающегося представления, и в этом подклассе я должен отключить взаимодействие с пользователем в подпредставлениях в UIControl (чтобы заставить его вращаться), что может привести к тому, что UIButtons не будет задействован. Как я могу сделать UIView, который пользователь может вращать, и содержащий интерактивные кнопки UIButton? Это ссылка на мой проект, которая дает вам фору: он содержит UIButtons и вращающийся UIView . Однако я не могу нажимать кнопки UIButtons.
Старый вопрос с подробностями
Я использую этот модуль: https://github.com/joshdhenry/SpinWheelControl, и я хочу отреагировать до нажатия кнопок. Я могу добавить кнопку, но не могу получать события касания кнопки. Я использую тесты попаданий, но они никогда не выполняются. Пользователь должен крутить колесо и иметь возможность нажимать кнопку в одном из пирогов.
Загрузите проект здесь: https://github.com/Jasperav/SpinningWheelWithTappableButtons
См. Код ниже, который я добавил в файл модуля:
Я добавил эту переменную в 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 в цикле "для номера клина в"
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, но я подумал, что для этого нужны хит-тесты.