同时滚动和捏合多个UiScrollViews

时间:2017-08-18 15:08:33

标签: ios swift uiscrollview uiimageview

我有一个UICollectionView,有四个自定义单元格。单元格的委托是我的主视图,它包含collectionView并扩展自定义单元格委托。每个单元格都包含一个UIScrollView,后者又包含并显示UIImageView。现在,我可以用pinch和doubleTap来放大和缩小并在单元格的scrollViews中移动图像。

我在我的应用程序中有一个"锁定视图"应该将视图锁定在一起的按钮,这样如果我在一个单元格中捏合(缩放或移动),那么该更改应该被复制"在其他细胞中。单元格中10%的变焦增加应该会触发所有其他单元格的10%变焦增加(独立于每个单元格电流zoomScale)。类似地,在一个单元格中向左移动10个单元应该将其他单元格向左移动10个单元。

我使用scrollViewDidScroll(_ scrollView: UIScrollView)方法检测我的scrollViews中的更改并调用我的委托,后者又可以访问我的主UICollectionView中的其他单元格

我的第一个问题是,当我使用UIScrollView.zoom(to : rect)UIScrollView.zoomScale时,它会在其他单元格中再次触发scrollViewDidScroll(_ scrollView: UIScrollView),从而创建一些无限循环之王,但我设法通过使用:

var isZooming = false

func scrollViewCustomZoom(to rect: CGRect, animated : Bool ) {
        isZooming = true
        scrollView.zoom(to: rect, animated: animated)
        isZooming = false
    }

并且:

func scrollViewDidScroll(_ scrollView: UIScrollView) {
        if isZooming { return }
        // do stuff, typically call the delegate
    }

但现在我的问题是:我需要在我的scrollViewDidScroll方法中计算什么,以及我需要在我的委托中的每个单元格中设置什么才能让你有我正在寻找的行为?

我已经尝试过scrollView.boundsscrollView.originscrollView.size,但无法获得正常的缩放系数。

任何帮助都会受到欢迎和赞赏。

1 个答案:

答案 0 :(得分:0)

找到了我自己的问题的解决方案。此解决方案不会在其他单元格中调用scrollViewDidScroll(),这正是我想要的。

这是诀窍:

// pinch-pan detection :
func scrollViewDidScroll(_ scrollView: UIScrollView) {
    let newOrigin = scrollView.bounds.origin
    let dx = newOrigin.x - currentScrollViewOrigin.x
    let dy = newOrigin.y - currentScrollViewOrigin.y

    let newScale = scrollView.zoomScale
    let ds = newScale - currentZoomScale

    if let d = delegate{
        d.notifyMouvementInCell(self, dx: dx, dy: dy, ds: ds)
    }

    currentScrollViewOrigin = scrollView.bounds.origin
    currentZoomScale = scrollView.zoomScale
}

在我的代表中:

func notifyMouvementInCell(_ cell: customCell, dx: CGFloat, dy: CGFloat, ds: CGFloat){
    if areViewsLocked{
        for visibleCell in collectionView.visibleCells as! [IMECasesMultiDisplayCollectionViewCell]{
            if visibleCell == cell { continue }
            visibleCell.copyMouvementInForeignCell(horOffset: dx, vertOffset: dy, scaleOffset: ds)
        }
    }
}

回到我的牢房里:

func copyMouvementInForeignCell(horOffset dx: CGFloat, vertOffset dy: CGFloat, scaleOffset ds: CGFloat){
    var newOrigin = scrollView.bounds.origin
    newOrigin.x += dx
    newOrigin.y += dy
    scrollView.bounds.origin = newOrigin

    var newScale = scrollView.zoomScale
    newScale += ds
    let affineTrans = CGAffineTransform(a: newScale, b: 0, c: 0, d: newScale, tx: 0, ty: 0)
    // imageView is the view contained in each of my cell's scrollViews
    imageView.layer.setAffineTransform(affineTrans)

    currentZoomScale = scrollView.zoomScale
    currentScrollViewOrigin = scrollView.bounds.origin
}

希望有一天这会对某人有所帮助!