简体   繁体   English

滑块确定重力

[英]Slider determines gravity

So far I've created a rectangle that starts from the bottom and moves upward using UiDynamicAnimator. 到目前为止,我已经使用UiDynamicAnimator创建了一个从底部开始并向上移动的矩形。 I would like the user to determine the "strength" of the negative gravity. 我希望用户确定负重力的“强度”。 I want the user to determine the value through a slider. 我希望用户通过滑块确定值。

This is my code so far: 到目前为止,这是我的代码:

    import UIKit

class ViewController: UIViewController {

    var orangeSquare: UIView?
    var animator: UIDynamicAnimator?

    override func viewDidLoad() {
        super.viewDidLoad()


        func sliderChanged(sender: AnyObject) {

            var sliderValue = sender.value

        }

                //Create animation
            let dim = CGRectMake(100, 500, 200, 100)
            orangeSquare = UIView(frame: dim)
            orangeSquare?.backgroundColor = UIColor.orangeColor()

                //Add item to the screen
            self.view.addSubview(orangeSquare!)

                //Initialize the animator
            animator = UIDynamicAnimator(referenceView: self.view)

                //Add gravity
            let gravity = UIGravityBehavior(items: [orangeSquare!])
            let direction = CGVectorMake(0.0, sliderValue)
            gravity.gravityDirection = direction

                //Collision
            let boundries = UICollisionBehavior(items: [orangeSquare!])
            boundries.translatesReferenceBoundsIntoBoundary = true

                //Add animations
            animator?.addBehavior(boundries)
            animator?.addBehavior(gravity)

    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}

I get two errors: 我得到两个错误:

"Ambiguous use of ´value´" and "Use of unresolved identifier ´sliderValue´" “歧义使用“值”和“使用未解析的标识符“ sliderValue””

How do I convert ´sliderValue´ into a float with just one decimal point? 如何将“ sliderValue”转换为只有一个小数点的浮点数?

your code is missing a few things. 您的代码缺少一些东西。 sliderValue is an unresolved identifier because you have only declared it within sliderChanged but are referring to it in the main body of viewDidLoad. SliderValue是一个无法解析的标识符,因为您仅在sliderChanged中声明了它,但在viewDidLoad的主体中引用了它。 Also, I think that your use of value is ambiguous because you have declared the parameter to the function as AnyObject, whose value could be any one of a number of things! 另外,我认为您对值的使用是模棱两可的,因为您已将函数的参数声明为AnyObject,其值可以是许多东西中的任何一个!

Your code was missing a mechanism linking a change in the value of the slider with a change in the gravity behaviour. 您的代码缺少将滑块值的变化与重力行为的变化联系起来的机制。 As such, I've implemented this using an explicit target attached to the slider object. 这样,我已经使用附加到滑块对象的显式目标实现了这一点。 I've also thrown in a label showing the magnitude of the gravitational force. 我还扔了一个标签,显示了重力的大小。 This is quite rough but I think it achieves what you were looking to do. 这很粗糙,但我认为它可以实现您想要的目标。

import UIKit

class ViewController: UIViewController {

    var dynamicAnimator : UIDynamicAnimator!
    var gravityBehaviour : UIGravityBehavior!
    var orangeSquare : UIView!
    var slider : UISlider!
    var sliderLabel : UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Subviews
        self.orangeSquare = {
            let oS : UIView = UIView(frame: CGRect(origin: CGPoint(x: (self.view.frame.width / 2) - 100, y: 500), size: CGSize(width: 200, height: 200)))
            oS.backgroundColor = UIColor.orange
            return oS
        }()

        self.slider = UISlider(frame: CGRect(origin: CGPoint(x: 100, y: 100), size: CGSize(width: self.view.frame.width - 400, height: 50)))
        self.slider.addTarget(self, action: #selector(self.sliderValueDidChange), for: UIControlEvents.allTouchEvents)
        self.slider.minimumValue = -5
        self.slider.maximumValue = 5
        self.slider.value = 0

        self.sliderLabel = UILabel(frame: CGRect(origin: CGPoint(x: self.view.frame.width - 100, y: 100), size: CGSize(width : 50, height: 50)))
        self.sliderLabel.backgroundColor = UIColor.red
        self.sliderLabel.textAlignment = NSTextAlignment.center
        self.sliderLabel.textColor = UIColor.white
        self.sliderLabel.text = String(self.slider.value)

        // Assemble
        self.view.addSubview(self.orangeSquare)
        self.view.addSubview(self.slider)
        self.view.addSubview(self.sliderLabel)

        // Configure dynamic behaviours

        self.dynamicAnimator = UIDynamicAnimator(referenceView: self.view)
        self.gravityBehaviour = UIGravityBehavior(items: [self.orangeSquare])
        self.gravityBehaviour.gravityDirection = CGVector(dx: 0, dy: 0)

        // Configure boundaries
        let boundaries : UICollisionBehavior = UICollisionBehavior(items: [self.orangeSquare])
        boundaries.translatesReferenceBoundsIntoBoundary = true

        self.dynamicAnimator.addBehavior(self.gravityBehaviour)
        self.dynamicAnimator.addBehavior(boundaries)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func sliderValueDidChange() {
        // When the slider value changes, update the label text and the gravity vector
        self.sliderLabel.text = String((round(self.slider.value) * 10) / 10)
        self.gravityBehaviour.gravityDirection = CGVector(dx: 0, dy: CGFloat(-1 * self.slider.value))
    }

}

Hope that helps. 希望能有所帮助。 All best! 一切顺利!

import UIKit

class ViewController: UIViewController {

    var dynamicAnimator : UIDynamicAnimator!
    var gravityBehaviour : UIGravityBehavior!
    var orangeSquare : UIView!
    var slider : UISlider!
    var sliderLabel : UILabel!

    override func viewDidLoad() {
        super.viewDidLoad()
        // Subviews
        self.orangeSquare = {
            let oS : UIView = UIView(frame: CGRect(origin: CGPoint(x: (self.view.frame.width / 2) - 100, y: 500), size: CGSize(width: 200, height: 200)))
            oS.backgroundColor = UIColor.orangeColor()
            return oS
            }()

        self.slider = UISlider(frame: CGRect(origin: CGPoint(x: self.view.frame.width - 100, y: 100), size: CGSize(width: self.view.frame.width - 300, height: 150)))
        self.slider.addTarget(self, action: #selector(self.sliderValueDidChange), forControlEvents: UIControlEvents.AllTouchEvents)
        self.slider.minimumValue = -10
        self.slider.maximumValue = 10
        self.slider.value = 0

        self.sliderLabel = UILabel(frame: CGRect(origin: CGPoint(x: self.view.frame.width - 100, y: 200), size: CGSize(width : 50, height: 50)))
        self.sliderLabel.backgroundColor = UIColor.redColor()
        self.sliderLabel.textAlignment = NSTextAlignment.Center
        self.sliderLabel.textColor = UIColor.whiteColor()
        self.sliderLabel.text = String(self.slider.value)

        // Assemble
        self.view.addSubview(self.orangeSquare)
        self.view.addSubview(self.slider)
        self.view.addSubview(self.sliderLabel)

        // Configure dynamic behaviours

        self.dynamicAnimator = UIDynamicAnimator(referenceView: self.view)
        self.gravityBehaviour = UIGravityBehavior(items: [self.orangeSquare])
        self.gravityBehaviour.gravityDirection = CGVector(dx: 0.0, dy: 0.0)

        // Configure boundaries
        let boundaries : UICollisionBehavior = UICollisionBehavior(items: [self.orangeSquare])
        boundaries.translatesReferenceBoundsIntoBoundary = true

        self.dynamicAnimator.addBehavior(self.gravityBehaviour)
        self.dynamicAnimator.addBehavior(boundaries)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    func sliderValueDidChange() {
        // When the slider value changes, update the label text and the gravity vector
        self.sliderLabel.text = String((round(self.slider.value) * 10) / 10)
        self.gravityBehaviour.gravityDirection = CGVector(dx: 0, dy: CGFloat(-1 * self.slider.value))
    }

}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM