Ограничить UIPanGestureRecognizer быстрыми границами - PullRequest
0 голосов
/ 03 ноября 2019

У меня есть изображения внутри ячейки uicollectionview, которые прокручиваются по горизонтали, я хочу получить такую ​​функцию, как Facebook и приложение для фотографий Apple, вы нажимаете на изображение, и оно покрывает весь экран. Вы можете сжимать и панорамировать изображение, я хочу добавить некоторые ограничения, такие же как приложение для Facebook и фото, например, когда вы сжимаете изображение, вы можете максимально панорамировать его ширину.

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

Сейчас я использую простой код.

 guard gestureRecognizer.view != nil else {return}
    print(self.imgView.frame)
    if self.imgView.frame.size.width < (self.imgOrignal.width+100) {
        return
    }

    let piece = gestureRecognizer.view!
    // Get the changes in the X and Y directions relative to
    // the superview's coordinate space.
    let translation = gestureRecognizer.translation(in: piece.superview)
    if gestureRecognizer.state == .began {
        self.initialCenter = piece.center
    }
    // Update the position for the .began, .changed, and .ended states
    if gestureRecognizer.state != .cancelled {
        // Add the X and Y translation to the view's original position.
        let newCenter = CGPoint(x: initialCenter.x + translation.x, y: initialCenter.y + translation.y)
        piece.center = newCenter
    }
    else {
        // On cancellation, return the piece to its original location.
        piece.center = initialCenter
    }
}

enter image description here ne

1 Ответ

0 голосов
/ 04 ноября 2019

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

  func setZoomScale() {
    let widthScale = self.bgView.frame.size.width / self.imgView.bounds.width
    let heightScale = self.bgView.frame.size.height / self.imgView.bounds.height
    let minScale = min(widthScale, heightScale)
    self.imgScrollView.minimumZoomScale = minScale
    self.imgScrollView.zoomScale = minScale
}


extension YOUR CLASS: UIScrollViewDelegate {

func viewForZooming(in scrollView: UIScrollView) -> UIView? {
    return self.imgView
}

func scrollViewDidZoom(_ scrollView: UIScrollView) {
    let imageViewSize = self.imgView.frame.size
    let scrollViewSize = scrollView.bounds.size
    let verticalInset = imageViewSize.height < scrollViewSize.height ? (scrollViewSize.height - imageViewSize.height) / 2 : 0
    let horizontalInset = imageViewSize.width < scrollViewSize.width ? (scrollViewSize.width - imageViewSize.width) / 2 : 0
    scrollView.contentInset = UIEdgeInsets(top: verticalInset, left: horizontalInset, bottom: verticalInset, right: horizontalInset)
}

}

...