создать универсальную переменную для просмотра изображений, чтобы добавить uipangesture - PullRequest
0 голосов
/ 10 февраля 2020

Мой быстрый код ниже объявляет 2 просмотра изображений и 2 uipangesutres. Этот код просто описывает 2 изображения, которые можно перемещать. Я хочу создать 1 uipangesture и применить его ко всем изображениям. Я думаю, что есть более эффективный способ сделать это. Вместо того, чтобы объявлять переменную для каждой вещи, которая должна быть перемещена в контроллере представления.

    import UIKit

  class ViewController: UIViewController {


var image1 = UIImageView(); var image2 = UIImageView()
var image1Pan = UIPanGestureRecognizer()
var image2Pan = UIPanGestureRecognizer()

override func viewDidLoad() {
    super.viewDidLoad()

    image1Pan = UIPanGestureRecognizer(target: self, action: #selector(ViewController.moveMethod))
    image1.addGestureRecognizer(image1Pan)

    image2Pan = UIPanGestureRecognizer(target: self, action: #selector(ViewController.moveMethod))
    image2.addGestureRecognizer(image2Pan)








    [image1,image2].forEach{
        $0.isUserInteractionEnabled = true

        view.addSubview($0)
        $0.translatesAutoresizingMaskIntoConstraints = false
    }



    // Do any additional setup after loading the view.
    NSLayoutConstraint.activate ([




        image1.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant :0),
        image1.topAnchor.constraint(equalTo: view.topAnchor, constant : 50),

        image1.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.10, constant: 0),
        image1.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.40, constant: 0),
        image1.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant : 0),




        image2.topAnchor.constraint(equalTo: view.topAnchor, constant : 50),

        image2.heightAnchor.constraint(equalTo: view.heightAnchor, multiplier: 0.10, constant: 0),
        image2.widthAnchor.constraint(equalTo: view.widthAnchor, multiplier: 0.40, constant: 0),
        image2.leadingAnchor.constraint(equalTo: image1.trailingAnchor, constant : 0),





    ])

    image1.backgroundColor = .blue
        image2.backgroundColor = .brown


}

@objc func moveMethod(_ sender: UIPanGestureRecognizer){



    let tranistioon = sender.translation(in: self.view)
    sender.view!.center = CGPoint(x: sender.view!.center.x + tranistioon.x, y: sender.view!.center.y + tranistioon.y)
    sender.setTranslation(CGPoint.zero,in: self.view)    }}

1 Ответ

0 голосов
/ 10 февраля 2020

Gesture Recognizer (такой как `UIPanGestureRecognizer) является объектом , а не свойством.

Вероятно, очевидно, что этот код:

    // create a NEW instance of UIImageView each time throught the loop
    let imgView = UIImageView()

    var x: CGFloat = 50
    [UIColor.red, UIColor.green, UIColor.blue].forEach {

        // add imgView to self.view
        view.addSubview(imgView)

        // set imgView's properties
        imgView.backgroundColor = $0
        imgView.frame = CGRect(x: x, y: 100, width: 50, height: 50)
        x += 100
    }

будет не приводит к 3 просмотрам изображения. Это даст вам один вид изображения с синим фоном с рамкой (250.0, 100.0, 50.0, 50.0). Это потому, что вы создали только один вид изображения и изменяете только его свойства каждый раз с помощью l oop.

Чтобы получить три вида изображений (красный, зеленый и синий фон), разнесенных на 50 пунктов, вам нужно будет сделать следующее:

    var x: CGFloat = 50
    [UIColor.red, UIColor.green, UIColor.blue].forEach {

        // create a NEW instance of UIImageView each time throught the loop
        let imgView = UIImageView()

        // add it to self.view
        view.addSubview(imgView)

        // set its properties
        imgView.backgroundColor = $0
        imgView.frame = CGRect(x: x, y: 100, width: 50, height: 50)
        x += 100
    }

Вот почему вы должны использовать тот же подход с распознавателями жестов. Вам нужен новый один для каждого объекта, к которому вы будете sh добавлять его.

В зависимости от того, что вы будете делать, вы можете немного упростить вещи:

    [image1, image2].forEach {
        $0.isUserInteractionEnabled = true
        view.addSubview($0)
        $0.translatesAutoresizingMaskIntoConstraints = false

        // create a NEW instance of UIPanGestureRecognizer
        let pg = UIPanGestureRecognizer(target: self, action: #selector(ViewController.moveMethod))

        // add it to $0 (an image view)
        $0.addGestureRecognizer(pg)
    }
...