如何限制自定义 UIControl 旋钮的运动范围?
How can I limit the range of motion on a custom UIControl Knob?
我正在学习教程 here,它演示了如何实现自定义 UIControl。但是,我想阻止自定义控件无休止地旋转。我已经能够阻碍旋转旋钮的能力,但无法创建明确的停止点。
我的尝试
在下面的代码中,我使用了作者 angle
范围从 0 到 360 的变量。逻辑有点奇怪,但我
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
super.continueTrackingWithTouch(touch, withEvent: event)
if (angle <= 1) {
angle = 2
return false
} else if angle >= 356 {
angle = 355
return false
} else {
let lastPoint = touch.locationInView(self)
self.moveHandle(lastPoint)
self.sendActionsForControlEvents(UIControlEvents.ValueChanged)
return true
}
}
注意:我已经尝试了所有明显的运算符和逻辑。我觉得这完全是错误的做法。
结果
基本上,控制运动 将 停在 1,但前提是我移动缓慢。如果我快速拖动旋钮,它会旋转到刚好超过 1,从而使控件可以无限旋转。
问题
如何正确限制 UIControls 的运动范围从 1 到 355?
我整理了一个简单的工作项目,您可以下载并测试。
将continueTrackingWithTouch
更改为:
// Part of UIControl, used to track user input
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
let lastPoint = touch.locationInView(self)
self.moveHandle(lastPoint)
return super.continueTrackingWithTouch(touch, withEvent: event)
}
将moveHandle
更改为:
func moveHandle(lastPoint:CGPoint){
let threshholdAngle = 180
let centerPoint:CGPoint = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
let currentAngle:Double = AngleFromNorth(centerPoint, p2: lastPoint, flipped: false)
let angleInt = Int(floor(currentAngle))
let newAngle = Int(360 - angleInt)
if abs(newAngle - angle) > threshholdAngle {
return
}
//Store the new angle
angle = newAngle
sendActionsForControlEvents(UIControlEvents.ValueChanged)
//Update the textfield
//textField!.text = "\(angle)"
//Redraw
setNeedsDisplay()
}
我正在学习教程 here,它演示了如何实现自定义 UIControl。但是,我想阻止自定义控件无休止地旋转。我已经能够阻碍旋转旋钮的能力,但无法创建明确的停止点。
我的尝试
在下面的代码中,我使用了作者 angle
范围从 0 到 360 的变量。逻辑有点奇怪,但我
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
super.continueTrackingWithTouch(touch, withEvent: event)
if (angle <= 1) {
angle = 2
return false
} else if angle >= 356 {
angle = 355
return false
} else {
let lastPoint = touch.locationInView(self)
self.moveHandle(lastPoint)
self.sendActionsForControlEvents(UIControlEvents.ValueChanged)
return true
}
}
注意:我已经尝试了所有明显的运算符和逻辑。我觉得这完全是错误的做法。
结果
基本上,控制运动 将 停在 1,但前提是我移动缓慢。如果我快速拖动旋钮,它会旋转到刚好超过 1,从而使控件可以无限旋转。
问题
如何正确限制 UIControls 的运动范围从 1 到 355?
我整理了一个简单的工作项目,您可以下载并测试。
将continueTrackingWithTouch
更改为:
// Part of UIControl, used to track user input
override func continueTrackingWithTouch(touch: UITouch, withEvent event: UIEvent?) -> Bool {
let lastPoint = touch.locationInView(self)
self.moveHandle(lastPoint)
return super.continueTrackingWithTouch(touch, withEvent: event)
}
将moveHandle
更改为:
func moveHandle(lastPoint:CGPoint){
let threshholdAngle = 180
let centerPoint:CGPoint = CGPointMake(self.frame.size.width / 2, self.frame.size.height / 2)
let currentAngle:Double = AngleFromNorth(centerPoint, p2: lastPoint, flipped: false)
let angleInt = Int(floor(currentAngle))
let newAngle = Int(360 - angleInt)
if abs(newAngle - angle) > threshholdAngle {
return
}
//Store the new angle
angle = newAngle
sendActionsForControlEvents(UIControlEvents.ValueChanged)
//Update the textfield
//textField!.text = "\(angle)"
//Redraw
setNeedsDisplay()
}