我正在遵循教程here,该教程演示了如何实现自定义UIControl。但是,我想阻止自定义控件不断旋转。我已经能够阻止旋转旋钮的功能,但是无法创建明确的停止点。

我的尝试

在下面的代码中,我正在使用authors 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
        }
    }


view code on github

注意:我已经尝试了所有显而易见的运算符和逻辑。我觉得这完全是错误的方法。

结果

基本上,控件的运动将停止为1,但前提是我必须缓慢移动。如果我快速拖动旋钮,它将向右旋转超过1,从而使控件不断旋转。



如何正确限制UIControls的运动范围从1到355?



我整理了一个可以下载和测试的简单工作项目。

project files

最佳答案

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()
}

关于swift - 如何限制自定义UIControl旋钮的运动范围?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35594420/

10-10 17:37