我有一个带有四个自定义单元格的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.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
}
希望有一天这会对某人有所帮助!
关于ios - 同时滚动和捏合多个 UiScrollView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45759855/