同时滚动和捏合多个UiScrollViews
我有一个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.origin
或scrollView.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
}
希望这会帮助别人一天!