Поверните UIImageView внутри UIScrollView, чтобы инвертировать X и Y. Зачем? - PullRequest
0 голосов
/ 01 августа 2020

У меня есть этот код, который заставляет мое изображение вращаться, масштабировать и панорамировать, чтобы позиционировать его на экране.

Проблема в том, что когда я поворачиваю изображение более чем на 90º, X и Y инвертируются. т.е. если я двигаюсь влево, изображение поднимается, а если я двигаюсь вправо, изображение опускается. Но когда изображение находится под углом 0º, я могу перемещать его как обычно.

class ViewController: UIViewController, UIGestureRecognizerDelegate {

    @IBOutlet weak var imgLogo: UIImageView!
    @IBOutlet weak var scrollLogo: UIScrollView!

    var identity = CGAffineTransform.identity

    override func viewDidLoad() {
        super.viewDidLoad()
        self.setupLayout()
    }

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        self.navigationController?.setNavigationBarHidden(true, animated: false)
        self.navigationItem.backBarButtonItem = UIBarButtonItem.init(title: " ", style: .plain, target: nil, action: nil)
        self.navigationItem.backBarButtonItem?.tintColor = .white
    }

    func setupLayout(){
    
        let pinchGesture = UIPinchGestureRecognizer(target: self, action: #selector(scale))
        let rotationGesture = UIRotationGestureRecognizer(target: self, action: #selector(rotate))
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(positioningImage))

        pinchGesture.delegate = self
        rotationGesture.delegate = self
        panGesture.delegate = self

        view.addGestureRecognizer(pinchGesture)
        view.addGestureRecognizer(rotationGesture)
        view.addGestureRecognizer(panGesture)
    }

    @objc func scale(_ gesture: UIPinchGestureRecognizer) {
        switch gesture.state {
        case .began:
            identity = imgLogo.transform
        case .changed,.ended:
            imgLogo.transform = identity.scaledBy(x: gesture.scale, y: gesture.scale)
        case .cancelled:
            break
        default:
            break
        }
    }
    @objc func rotate(_ gesture: UIRotationGestureRecognizer) {
        imgLogo.transform = imgLogo.transform.rotated(by: gesture.rotation)
    }

    @objc func positioningImage(_ gesture: UIPanGestureRecognizer) {
        let points = gesture.translation(in: scrollLogo)
    
        imgLogo.transform = imgLogo.transform.translatedBy(x: points.x, y: points.y)

        gesture.setTranslation(CGPoint.zero, in: scrollLogo)
    }

    func gestureRecognizer(_ gestureRecognizer: UIGestureRecognizer, shouldRecognizeSimultaneouslyWith otherGestureRecognizer: UIGestureRecognizer) -> Bool {
        return true
    }
}

Кто-нибудь может помочь мне указать, что не так? Где / как исправить?

Спасибо

1 Ответ

1 голос
/ 01 августа 2020

Ваше панорамирование в настоящее время относительно scrollLogo, если вы измените объявление точек на

let points = gesture.translation(in: imgLogo)

, тогда панорамирование будет выполнено относительно текущего перевода изображения, и оно должно работать, как задумано!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...