2017-08-18 13 views
0

私はUICollectionViewに4つのカスタムセルを持っています。セルのデリゲートは、collectionViewを含み、カスタムセルデリゲートを拡張するメインビューです。各セルには、UIScrollViewが含まれ、順番にUIImageViewが表示されます。今のところ私はピンチとダブルタップでズームイン/ズームアウトし、セルのスクロールビュー内で画像を移動できます。同時に複数のUiScrollViewsをスクロールして挟み込む

私はビューを一緒にロックする必要があるので、私はピンチ(ズームまたは移動)セル内で、その変更は他のセルで "コピー"する必要がありますように、 "ロックビュー"ボタンがあります。セル内で10%のズームが増加すると、他のすべてのセルで10%のズームが増加します(各セルのセルに独立してzoomScale)。同様に、1つのセルの左側への10単位の移動は、他のセルの左側への10単位の移動を必要とする。

私はUIScrollView.zoom(to : rect)UIScrollView.zoomScaleそれを使用したときに私の最初の問題があることだった私のメインUICollectionView

に今度は私の他のセルへのアクセスを持っている私のscrollViewsの変化を検出して、私のデリゲートを呼び出すためにscrollViewDidScroll(_ scrollView: UIScrollView)メソッドを使用していますしたがって、無限ループのいくつかの王を作成し、再び他の細胞内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.origin、またはscrollView.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 
} 

・ホープここ

はトリックです!

関連する問題