如何在imageview中嵌入滑动手势时启用滑动手势

时间:2017-05-23 11:10:52

标签: ios swift3 uigesturerecognizer

在这里我已经在图像视图上实现了滑动手势,它嵌入在滚动视图中,但手势不起作用,这里是我的代码任何解决方案吗?

 collectionView.delegate = self
        collectionView.dataSource = self
        imageView.isUserInteractionEnabled = true
        let swipeLeft = UISwipeGestureRecognizer(target: self, action:#selector(swiped(gesture:)))
        swipeLeft.direction = .left
        self.imageView.addGestureRecognizer(swipeLeft)
        swipeLeft.cancelsTouchesInView = false
        let swipeRight = UISwipeGestureRecognizer(target: self, action: #selector(swiped(gesture:)))
        swipeRight.direction = .right
        self.imageView.addGestureRecognizer(swipeRight)
        swipeRight.cancelsTouchesInView = false
        imageView.isUserInteractionEnabled = true
        let tap = UITapGestureRecognizer(target: self, action: #selector(imageTapped(_:)))
        self.imageView.addGestureRecognizer(tap)

2 个答案:

答案 0 :(得分:0)

如果您想同时滑动和滚动两者,则必须实现手势识别器委托。

//这是使用Swift语法的协议方法

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

func gestureRecognizer(gestureRecognizer: UIGestureRecognizer, shouldReceiveTouch touch: UITouch) -> Bool {
    return true
}

可能你可以试试这个。不要忘记自己委派。 :)

答案 1 :(得分:0)

对于您的情况,您希望拥有像Gallery View这样的UI。只需向左和向右滑动即可更改照片,然后点按/ DoubleTap进行缩放。

不需要滑动手势。

只需启用分页即可使用Collection视图。每个单元格将显示单个图像。启用分页时,一次只显示一个单元格。

因此,只需在集合视图中启用Paging并尝试运行。

如果要缩放,则在点击单元格时,将TapGesture添加到CollectionView的父UIScrollView并相应地执行写入操作。 在这种情况下,我使用了自定义集合视图单元格。

我刚刚添加了我的自定义单元格代码供您参考,如下所示。

class ImageViewerCollectionViewCell: UICollectionViewCell {

@IBOutlet weak var scrollView: UIScrollView!
@IBOutlet weak var imageView: UIImageView!

@IBOutlet weak var activityIndicator: UIActivityIndicatorView!
override func awakeFromNib() {
    super.awakeFromNib()

    self.scrollView.minimumZoomScale = 1.0
    self.scrollView.maximumZoomScale = 6.0
    self.scrollView.delegate = self
    self.scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
    self.scrollView.zoom(to: CGRect(origin: CGPoint.zero, size: scrollView.frame.size), animated: true)

    let doubleTap = UITapGestureRecognizer(target: self, action: #selector(doubleTapAction(_:)))
    doubleTap.numberOfTapsRequired = 2
    self.scrollView.addGestureRecognizer(doubleTap)
}

func setURL(imageURL : URL, needLoader : Bool) {

    DispatchQueue.main.async {
        self.scrollView.setZoomScale(self.scrollView.minimumZoomScale, animated: true)
        self.scrollView.zoom(to: CGRect(origin: CGPoint.zero, size: self.scrollView.frame.size), animated: true)

        if needLoader {
            self.activityIndicator.isHidden = false
            self.activityIndicator.startAnimating()
            self.imageView.pin_setImage(from: imageURL, completion: { (completed) in
                self.activityIndicator.stopAnimating()
                self.activityIndicator.isHidden = true
            })
        }
        else {
            self.activityIndicator.isHidden = true
            self.imageView.pin_setImage(from: imageURL, placeholderImage: placeHolderImage)
        }
        self.imageView.pin_updateWithProgress = true
    }
}

@IBAction func doubleTapAction(_ sender: Any) {

    if scrollView.zoomScale == scrollView.minimumZoomScale {

        let touchPoint = (sender as! UITapGestureRecognizer).location(in: scrollView)
        let scale = min(scrollView.zoomScale * 3, scrollView.maximumZoomScale)

        let scrollSize = scrollView.frame.size
        let size = CGSize(width: scrollSize.width / scale,
                          height: scrollSize.height / scale)
        let origin = CGPoint(x: touchPoint.x - size.width / 2,
                             y: touchPoint.y - size.height / 2)
        scrollView.zoom(to:CGRect(origin: origin, size: size), animated: true)
    }
    else {
        scrollView.setZoomScale(scrollView.minimumZoomScale, animated: true)
        scrollView.zoom(to: CGRect(origin: CGPoint.zero, size: scrollView.frame.size), animated: true)
    }
}
}

extension ImageViewerCollectionViewCell : UIScrollViewDelegate {

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

如上所述,我在UIScrollView中使用了一个imageview。因此,当您双击该滚动视图时,scrollview将放大&出。

希望你明白并希望它有所帮助。