旋转瓶与UIGestureRecognizer

时间:2016-06-22 12:58:22

标签: ios xcode swift uiimageview uigesturerecognizer

我现在正在使用此代码在按钮上旋转瓶子:

@IBAction func spinButton(sender: AnyObject) {
        let rotateView = CABasicAnimation()
        let randonAngle = arc4random_uniform(360) + 720
        rotateView.fromValue = 0
        rotateView.toValue = Float(randonAngle) * Float(M_PI) / 180.0
        rotateView.duration = 3
        rotateView.delegate = self
        rotateView.repeatCount = 0
        rotateView.removedOnCompletion = false
        rotateView.fillMode = kCAFillModeForwards
        rotateView.timingFunction = CAMediaTimingFunction(name: kCAMediaTimingFunctionEaseOut)
        bottleImageView.layer.addAnimation(rotateView, forKey: "transform.rotation.z")
    }

但是如何使用手势旋转按钮?因此,我移动手指越硬/越快,瓶子旋转的速度就越快

3 个答案:

答案 0 :(得分:2)

对此的简单回答是......使用UIScrollView

来自我的问题...... Loop UIScrollView but continue decelerating

将它翻译成Swift是微不足道的,但这里有......

override func viewDidLoad() {
    super.viewDidLoad()
    // Do any additional setup after loading the view, typically from a nib.

    //make the content size really big so that the targetOffset of the deceleration will never be met.

    scrollView.contentSize = CGSize(width: CGRectGetWidth(scrollView.frame) * 100.0, height: CGRectGetHeight(scrollView.frame))
    //set the contentOffset of the scroll view to a point in the center of the contentSize.
    scrollView.setContentOffset(CGPoint(CGRectGetWidth(scrollView.frame) * 50, 0), animated: false)
}

func rotateImageView() {
    //Calculate the percentage of one "frame" that is the current offset.

    // each percentage of a "frame" equates to a percentage of 2 PI Rads to rotate
    let minOffset = CGRectGetWidth(scrollView.frame) * 50.0
    let maxOffset = CGRectGetWidth(scrollView.frame) * 51.0

    let offsetDiff = maxOffset - minOffset

    let currentOffset = scrollView.contentOffset.x - minOffset

    let percentage = currentOffset / offsetDiff

    arrowView.transform = CGAffineTransformMakeRotation(M_PI * 2 * percentage)
}

func scrollViewDidScroll(scrollView: UIScrollView) {
    //the scrollView moved so update the rotation of the image
    rotateImageView()
}

func scrollViewDidEndDecelerating(scrollView: UIScrollView) {
    //the scrollview stopped moving.
    //set the content offset back to be in the middle
    //but make sure to keep the percentage (used above) the same
    //this ensures the arrow is pointing in the same direction as it ended decelerating

    let diffOffset = scrollView.contentOffset.x

    while diffOffset >= CGRectGetWidth(scrollView.frame) {
        diffOffset = diffOffset - CGRectGetWidth(scrollView.frame)
    }

    scrollView.setContentOffset(CGPoint(x: CGRectGetWidth(scrollView.frame) * 50 + diffOffset, y: 0), animated:false)
}

在此示例中,我的旋转视图是arrowViewscrollViewarrowView都应该是视图控制器视图的子视图。 scrollView中不应包含任何内容。

N.B。这是在浏览器中完成的,因此可能存在一些语法问题。您可能还需要将一些数字转换为CGFloat等...

此外,能够从Objective-C翻译对于任何iOS开发都是必不可少的。使用Objective-C编写了数百万个应用程序。语法可能略有不同,但所有API都是相同的。

学习如何做到这一点是每个iOS开发人员应该做的事情。

答案 1 :(得分:2)

我设法创建了一个示例应用程序,其中心有一个视图,您可以使用AVAILABLE旋转,旋转速度将根据旋转速度受到影响。我已经使用了UIRotationGestureRecognizer

UIDynamics

当你跑步时,你可以根据旋转速度手势旋转视图。

答案 2 :(得分:1)

使用UIPanGestureRecognizer。创建一个panGestureRecognizer并将其添加到您的瓶子的超级视图中并实现它的代理。它包含velocityInViewtranslationInView等变量。当用户完成平移时,使用它们来计算旋转的角度,速度和持续时间。