ios - 同时滚动和捏合多个 UiScrollView

标签 ios swift uiscrollview uiimageview

我有一个带有四个自定义单元格的UICollectionView。单元格的委托(delegate)是我的主视图,其中包含 collectionView 并扩展了自定义单元格委托(delegate)。每个单元格都包含一个UIScrollView,它又包含并显示一个UIImageView。现在,我可以通过捏合和双击来放大和缩小以及在单元格的 ScrollView 内移动图像。

我的应用程序中有一个“锁定 View ”按钮,该按钮应该将 View 锁定在一起,这样,如果我在单元格中捏合(缩放或移动),该更改应该被“复制”到其他单元格中。单元格中 10% 的缩放增加应该会触发所有其他单元格中 10% 的缩放增加(独立于每个单元格的当前 zoomScale)。同样,一个单元格向左移动 10 个单位,其他单元格也会向左移动 10 个单位。

我正在使用 scrollViewDidScroll(_scrollView: UIScrollView) 方法来检测我的 ScrollView 中的更改并调用我的委托(delegate),该委托(delegate)反过来可以访问我的主 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 方法中计算什么,以及我需要在委托(delegate)中的每个单元格中设置什么才能获得我正在寻找的行为为了?

我已经尝试过使用 scrollView.boundsscrollView.originscrollView.size,但无法获取缩放因子才能正常运行。

我们非常欢迎并感谢任何帮助。

最佳答案

找到了我自己问题的解决方案。此解决方案不会在其他单元格中调用 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
}

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

关于ios - 同时滚动和捏合多个 UiScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759855/

相关文章:

ios -\d 和\w 元字符是否包含国际字符?

ios - 无法从 iCloud 照片库下载视频

ios - 如何使用 iOS-Charts 设置 x 轴的最小值和最大值

ios - Swift:为所有 View 添加离线栏,例如在 Facebook Messenger 中

ios - 在 ScrollView 中禁用向后滚动的最简单方法

ios - Swift - 无法使 PickerView 库正常工作

ios - 运行在iOS 7.0 上的应用程序具有iOS 6.0 界面

ios - UIScrollView 在 addSubview 或更改框架后不需要的滚动

ios - 启用内容插入的 UIScrollView 分页工作异常

ios - 已执行最大重试次数。上传ipa问题