Перетащите изображение с гравитацией на Swift - PullRequest
0 голосов
/ 07 ноября 2018

Я пытаюсь создать код в XCode для перетаскивания изображения, чтобы я мог перемещать его, а когда я его уронил, это может иметь эффект гравитации. Я создал новый класс для моего изображения под названием DraggedImageView (который наследуется от UIImageView) со следующими изменениями:

 override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        startLocation = touches.first?.location(in: self)
    }

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) {
        let currentLocation = touches.first?.location(in: self)
        let dx = currentLocation!.x - startLocation!.x
        let dy = currentLocation!.y - startLocation!.y
        self.center = CGPoint(x: self.center.x+dx, y: self.center.y+dy)
}

В моем ViewController у меня есть:

import UIKit

class ViewController: UIViewController {
    // Moving background items
    @IBOutlet weak var groundView: UIImageView!
    @IBOutlet weak var background1View: UIImageView!
    @IBOutlet weak var background2View: UIImageView!
    @IBOutlet weak var background3View: UIImageView!
    @IBOutlet weak var cloud1View: UIImageView!
    @IBOutlet weak var cloud2View: UIImageView!

    // Main character items
    @IBOutlet weak var marioView: DraggedImageView!

    // Behavior items
    var dynamicAnimator: UIDynamicAnimator!
    var collisionBehavior: UICollisionBehavior!
    var gravityBehavior: UIGravityBehavior!

    override func viewDidLoad() {
        super.viewDidLoad()

        self.view.addSubview(background1View)
        self.view.addSubview(background2View)
        self.view.addSubview(background3View)
        self.view.addSubview(groundView)
        self.view.addSubview(cloud1View)
        self.view.addSubview(cloud2View)
        self.view.addSubview(marioView)

        dynamicAnimator = UIDynamicAnimator(referenceView: self.view)

        gravityBehavior = UIGravityBehavior(items: [marioView])
        dynamicAnimator.addBehavior(gravityBehavior)
        gravityBehavior.magnitude = 0.5

        collisionBehavior = UICollisionBehavior(items: [marioView])
        collisionBehavior.translatesReferenceBoundsIntoBoundary = true
        dynamicAnimator.addBehavior(collisionBehavior)
    }

Проблема в том, что главный герой падает только один раз, и когда я пытаюсь снова его перетащить, гравитация не работает. Кроме того, в зависимости от того, на каком симуляторе я выполняю код, границы для столкновений не являются правильными.

Я просто хочу, чтобы у него было правильное поведение, но я пробовал много способов, и я не в состоянии это сделать.

...