Zoom ImageView в UICollectionView не соответствует - PullRequest
0 голосов
/ 11 июля 2019

У меня есть UICollectionView с ячейками, размером с саму CollectionView, поэтому подкачка включена, и вы проводите по аналогии с базовым приложением Галерея .

Iхотите, чтобы изображения масштабировались, как в Instagram (привязка к концу жеста).Я реализовал жесты Pinch и Pan с помощью статьи, и она работает.

Но у меня странная проблема.Скорость масштабирования очень непоследовательна, и кажется, что она становится быстрее с каждой страницей, которую я переворачиваю.Таким образом, первая страница довольно широко масштабируется и масштабируется, вторая - намного быстрее, а третья - просто смешно.Я очень сбит с толку, так как у меня был этот точный код, работающий на пейджинговом ScrollView, и он работал безупречно.

Вот соответствующий код в UICollectionViewCell.

func setup(){
    imageView.isUserInteractionEnabled = true

    let pinch = UIPinchGestureRecognizer(target: self, action: 
#selector(pinch(sender:)))
    pinch.delegate = self
    imageView.addGestureRecognizer(pinch)

    let pan = UIPanGestureRecognizer(target: self, action: 
#selector(pan(sender:)))
    pan.delegate = self
    imageView.addGestureRecognizer(pan)

    let tap = UITapGestureRecognizer(target: self, action: 
#selector(handleTap))
    imageView.addGestureRecognizer(tap)

    imageView.clipsToBounds = false
}


 @objc func pan(sender: UIPanGestureRecognizer) {
    if(isZooming){
        if self.isZooming && sender.state == .began {
            self.originalImageCenter = sender.view?.center
        } else if self.isZooming && sender.state == .changed {
            let translation = sender.translation(in: self)
            if let view = sender.view {
                view.center = CGPoint(x:view.center.x + 
                                      translation.x,
                                      y:view.center.y + 
                                      translation.y)
            }
            sender.setTranslation(CGPoint.zero, in: 
self.imageView.superview)
        }
    }else{
        print("blocked pan")
    }

}

@objc func pinch(sender:UIPinchGestureRecognizer) {
    NotificationCenter.default.post(name: 
Notification.Name(rawValue: "disablePage"), object: nil)

    allowedToTap = false

    if sender.state == .began {
        let currentScale = self.imageView.frame.size.width / 
self.imageView.bounds.size.width
        let newScale = currentScale*sender.scale
        if newScale > 1 {
            self.isZooming = true
        }
    } else if sender.state == .changed {
        guard let view = sender.view else {return}
        let pinchCenter = CGPoint(x: sender.location(in: view).x - 
                                  view.bounds.midX,
                                  y: sender.location(in: view).y - 
                                  view.bounds.midY)
        let transform = view.transform.translatedBy(x: 
pinchCenter.x, y: pinchCenter.y)
            .scaledBy(x: sender.scale, y: sender.scale)
            .translatedBy(x: -pinchCenter.x, y: -pinchCenter.y)
        let currentScale = self.imageView.frame.size.width / 
self.imageView.bounds.size.width
        var newScale = currentScale*sender.scale
        if newScale < 1 {
            newScale = 1
            let transform = CGAffineTransform(scaleX: newScale, y: 
newScale)
            self.imageView.transform = transform
            sender.scale = 1
        }else {
            view.transform = transform
            sender.scale = 1
        }
    } else if sender.state == .ended || sender.state == .failed || 
 sender.state == .cancelled {
        guard let center = self.originalImageCenter else {return}
        UIView.animate(withDuration: 0.3, animations: {
            self.imageView.transform = CGAffineTransform.identity
            self.imageView.center = center
        }, completion: { _ in
            self.isZooming = false

            NotificationCenter.default.post(name: 
Notification.Name(rawValue: "enablePage"), object: nil)
            self.allowedToTap = true

        })
    }
}

Iнадеюсь, кто-то с большим количеством идей о том, как это работает, может мне помочь.

1 Ответ

0 голосов
/ 12 июля 2019

Я нашел решение, я оставлю его здесь на случай, если у кого-то возникнет та же проблема.

Проблема заключалась в том, что функция установки вызывалась несколько раз, поэтому добавлялось несколько идентичных идентификаторов GestureRecognizer.

Так что я просто добавил быструю проверку.

func setup(){
    imageView.isUserInteractionEnabled = true
    playPauseImageView.alpha = 0

    if(!gesturesAreAttached){
        gesturesAreAttached = true
        addZoom()
    }
    imageView.clipsToBounds = false
}

func addZoom(){
    print("adding Zoom")
    let pinch = UIPinchGestureRecognizer(target: self, action: #selector(pinch(sender:)))
    pinch.delegate = self
    imageView.addGestureRecognizer(pinch)

    let pan = UIPanGestureRecognizer(target: self, action: #selector(pan(sender:)))
    pan.delegate = self
    imageView.addGestureRecognizer(pan)

    let tap = UITapGestureRecognizer(target: self, action: #selector(handleTap))
    imageView.addGestureRecognizer(tap)

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