iOS Spin UIImageView with deceleration motion at random position

 ̄綄美尐妖づ 提交于 2021-02-11 17:44:44

问题


I trying to create a spin wheel which rotate on tap and it rotates for certain period of time and stops at some random circular angle.

import UIKit

class MasterViewController: UIViewController {

    lazy var imageView: UIImageView = {
        let bounds = self.view.bounds
        let v = UIImageView()
        v.backgroundColor = .red
        v.frame = CGRect(x: 0, y: 0,
                         width: bounds.width - 100,
                         height: bounds.width - 100)
        v.center = self.view.center
        return v
    }()

    lazy var subView: UIView = {
        let v = UIView()
        v.backgroundColor = .black
        v.frame = CGRect(x: 0, y: 0,
                         width: 30,
                         height: 30)
        return v
    }()

    var dateTouchesEnded: Date?
    var dateTouchesStarted: Date?

    var deltaAngle = CGFloat(0)
    var startTransform: CGAffineTransform?
    var touchPointStart: CGPoint?


    override func viewDidLoad() {
        super.viewDidLoad()
        self.imageView.addSubview(self.subView)
        self.view.addSubview(self.imageView)
        self.imageView.isUserInteractionEnabled = true
        self.setupGesture()
    }

    private func setupGesture() {
        let gesture = UITapGestureRecognizer(target: self,
                                             action: #selector(handleGesture(_:)))
        self.view.addGestureRecognizer(gesture)
    }

    @objc
    func handleGesture(_ sender: UITapGestureRecognizer) {
        var timeDelta = 1.0
        let _ = Timer.scheduledTimer(withTimeInterval: 0.2,
                                         repeats: true) { (timer) in
            if timeDelta < 0 {
                timer.invalidate()
            } else {
                timeDelta -= 0.03
                self.spinImage(timeDelta: timeDelta)
            }
        }
    }

    func spinImage(timeDelta: Double) {
        print("TIME DELTA:", timeDelta)

        let direction: Double = 1

        let rotation: Double = 1

        UIView.animate(withDuration: 5,
                       delay: 0,
                       options: .curveEaseOut,
                       animations: {

                        let transform = self.imageView.transform.rotated(
                            by: CGFloat(direction) * CGFloat(rotation) * CGFloat(Double.pi)
                        )
                        self.imageView.transform = transform

        }, completion: nil)
    }

}

I tried via above code, but always stops on initial position

i.e. the initial and final transform is same.

I want it to be random at every time.


回答1:


One thing you can do is make a counter with a random number within a specified range. When the time fires, call spinImage then decrement the counter. Keep doing that until the counter reaches zero. This random number will give you some variability so that you don't wind up with the same result every time.

@objc func handleGesture(_ sender: UITapGestureRecognizer) {
    var counter = Int.random(in: 30...33)
    let _ = Timer.scheduledTimer(withTimeInterval: 0.2, repeats: true) { (timer) in
        if counter < 0 {
            timer.invalidate()
        } else {
            counter -= 1
            self.spinImage()
        }
    }
}

In spinImage, instead of rotating by CGFloat.pi, rotate by by CGFloat.pi / 2 so that you have four possible outcomes instead of two.

func spinImage() {
    UIView.animate(withDuration: 2.5,
                   delay: 0,
                   options: .curveEaseOut,
                   animations: {
                    let transform = self.imageView.transform.rotated(
                        by: CGFloat.pi / 2
                    )
                    self.imageView.transform = transform

    }, completion: nil)
}

You may want to mess around with the counter values, the timer interval, and the animation duration to get the effect that you want. The values I chose here are somewhat arbitrary.



来源:https://stackoverflow.com/questions/62372147/ios-spin-uiimageview-with-deceleration-motion-at-random-position

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!