无限奥特莱斯

Infinite Outlets

嗨,我正在制作一个应用程序,您可以在其中用小玩意儿装饰圣诞树我已经编写了能够将其拖动到视图周围的代码,但是我 运行 没有小玩意儿我该怎么做我可以有很多小玩意放在圣诞树上。我曾多次尝试复制一个小玩意,但随后将它们全部添加到代码中,但它不起作用,因为它同时拖动了它们。如果你看图片里面有小玩意,但我希望它拖一个但一个仍然在那里可以戴上

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var red_bauble_1: UIImageView!

    override func viewDidLoad() {
        super.viewDidLoad()

        let gesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.wasDragged(_ :)))
        red_bauble_1.addGestureRecognizer(gesture)
        red_bauble_1.isUserInteractionEnabled = true
    }

    @objc func wasDragged (_ gesture: UIPanGestureRecognizer) {

        let translation = gesture.translation(in: self.view)
        let red_bauble_1 = gesture.view

        red_bauble_1?.center = CGPoint(x: red_bauble_1!.center.x + translation.x, y: (red_bauble_1?.center.y)! + translation.y)
        gesture.setTranslation(CGPoint.zero, in: self.view)

    }

}

如果您要添加数量可变的装饰品作为子视图并希望保留对它们的引用,只需为它们创建一个数组,例如

var ornaments = [UIView]()  // or, if they're image views, `[UIImageView]()`

然后你可以把你的装饰品添加到那个数组,就像你把它们添加到你的树上一样,你就有了一个数组来跟踪所有的装饰品。


例如:

class ViewController: UIViewController {

    @IBOutlet weak var treeImageView: UIImageView!
    @IBOutlet weak var ornamentToolImageView: UIImageView!

    private var currentOrnament: UIView!

    private var ornaments = [UIView]()

    override func viewDidLoad() {
        super.viewDidLoad()

        let pan = UIPanGestureRecognizer(target: self, action: #selector(dragOrnamentFromToolbar(_:)))
        ornamentToolImageView.addGestureRecognizer(pan)
    }

    /// Gesture for dragging ornament from toolbar on to the tree
    ///
    /// This creates new ornament and adds it to view hierarchy as well as to our array of `ornaments`

    @IBAction func dragOrnamentFromToolbar(_ gesture: UIPanGestureRecognizer) {
        let location = gesture.location(in: treeImageView)

        switch gesture.state {
        case .began:
            gesture.view?.isHidden = true                 // temporarily hide toolbar view so it feels like we're dragging it
            let image = UIImage(named: "ornament")!
            currentOrnament = UIImageView(image: image)
            ornaments.append(currentOrnament)
            treeImageView.addSubview(currentOrnament)
            fallthrough

        case .changed:
            currentOrnament.center = location

        case .ended, .cancelled:
            // when done, add new pan gesture for dragging around new ornament

            gesture.view?.isHidden = false                // restore toolbar view
            currentOrnament.isUserInteractionEnabled = true
            let pan = UIPanGestureRecognizer(target: self, action: #selector(dragExistingOrnament(_:)))
            currentOrnament.addGestureRecognizer(pan)
            currentOrnament = nil

        default:
            break
        }
    }

    /// Gesture for dragging existing ornament
    ///
    /// This grabs existing and allows you to drag it around

    @IBAction func dragExistingOrnament(_ gesture: UIPanGestureRecognizer) {
        let location = gesture.location(in: treeImageView)

        switch gesture.state {
        case .began:
            currentOrnament = gesture.view
            fallthrough

        case .changed:
            currentOrnament.center = location

        default:
            break
        }
    }

}

结果: