2017-08-18 39 views
0

我有一个UICollectionView四个自定义单元格。单元格的委托是我的主视图,它包含collectionView并扩展了一个自定义单元格委托。每个单元格包含一个UIScrollView,后者又包含并显示一个UIImageView。现在,我可以捏和doubleTap放大和缩小,并在单元格的scrollViews内移动图像。同时滚动和捏合多个UiScrollViews

我在我的应用程序中有一个“锁定视图”按钮,它应该将视图锁定在一起,这样如果我在一个单元格中捏住(缩放或移动),应该将这个更改“复制”到其他单元格中。单元格中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.bounds,scrollView.originscrollView.size,但无法获得比例因子的正确表现。

任何帮助将是最受欢迎和赞赏。

回答

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 
} 

希望这会帮助别人一天!