gpt4 book ai didi

ios - 捏缩放后保持 collectionView 单元格位置

转载 作者:可可西里 更新时间:2023-11-01 03:58:57 27 4
gpt4 key购买 nike

我有一个 collectionView,我可以在捏合时缩放它。

它是这样工作的:

我在 collectionView 上添加了一个 UIPinchGestureRecognizer,当发生捏合时我使布局无效,这会强制 collectionView 向委托(delegate)请求新的大小。

效果不错。

我无法解决的问题是,在紧缩期间我想将我的单元格保持在同一位置。就在屏幕中间的指示器下方。 (见屏幕截图)。

我想在捏合开始时存储当前的 scrollView 偏移量,然后当单元格以新尺寸重新显示时,我计算宽度差异并添加或减去 contentOffset。

我有一个 contentInset 以便滚动 collectionView 中间的第一个单元格。

这是我的代码:

@objc func handlePinchGesture(gesture: UIPinchGestureRecognizer) {

if (gesture.state == .Began) {
scaleStart = metrics.scale // remember current scale
widthStart = collectionView.visibleCells()\[0\].bounds.width // get size of a cell to calulate a difference when scale will change
originalContentOffset = collectionView.contentOffset.x // remember original content offset
}
else if (gesture.state == .Changed) {

let newScale = metrics.normalizeScale(scaleStart * gesture.scale) // normalize scale. give 0.5, 1, 1.5, 2

metrics.scale = newScale // global struct

//let ZoomIn = (newScale > scaleStart)

collectionView.collectionViewLayout.invalidateLayout() // invalidate layout in order to redisplay cell with updated scale

let scaleRatio = newScale / self.scaleStart
var newContentOffset = CGFloat(0)

let widthDiff: CGFloat = (scaleRatio * self.widthStart) - self.widthStart

newContentOffset = originalContentOffset + widthDiff

self.collectionView.setContentOffset(CGPointMake(newContentOffset ,0), animated: false)
}
}

它只是行不通...

你有什么想法吗?

非常感谢您的意见。

这是我拥有和想要的具有正确偏移量的屏幕截图。但是我无法找到一种正确的方法来计算捏合手势后的内容偏移量。

screenshot

蒂埃里

最佳答案

关于您最初的问题,您希望缩放中心位于屏幕中间的位置,请尝试以下操作:

@objc func handlePinchGesture(_ gesture: UIPinchGestureRecognizer) {
let scaleValue: CGFloat = gesture.scale
if (gesture.state == .began) {
scaleStart = metrics.scale // remember current scale
widthStart = collectionView.visibleCells[0].bounds.width // get size of a cell to calulate a difference when scale will change
originalContentOffset = collectionView.contentOffset.x // remember original content offset
originalNumberOfCellsToOffset = (originalContentOffset + (self.view.frame.size.width/2)) / (widthStart * 2) //for zooming at the middle of the screen
}
else if (gesture.state == .changed) {

let newScale = scaleStart * gesture.scale
//let newScale = metrics.normalizeScale(scaleStart * gesture.scale) // use this line instead, if you want to normalize scale. give 0.5, 1, 1.5, 2

metrics.scale = newScale // global struct

//let ZoomIn = (newScale > scaleStart)

collectionView.collectionViewLayout.invalidateLayout() // invalidate layout in order to redisplay cell with updated scale

let scaleRatio = newScale / scaleStart
var newContentOffset = CGFloat(0)

let offsetDiffForEachCell: CGFloat = (scaleRatio * widthStart) - widthStart

newContentOffset = (offsetDiffForEachCell)*originalNumberOfCellsToOffset + (originalContentOffset)

collectionView.setContentOffset(CGPoint(x: newContentOffset ,y: 0), animated: false)
}
}

根据屏幕上 collectionView 的位置和大小,它可能不会在屏幕中间真正缩放。如果是这种情况,您要做的就是更改此行:

originalNumberOfCellsToOffset =  (originalContentOffset + (self.view.frame.size.width/2)) / (widthStart * 2)  //for zooming at the middle of the screen

例如

originalNumberOfCellsToOffset =  (originalContentOffset + (self.view.frame.size.width/2) - 20) / (widthStart * 2)  //for zooming at the middle of the screen

如果您希望缩放中心向左多 20px。


奖励:相反,如果您想在捏合的中间放大,则更改此行:

originalNumberOfCellsToOffset =  (originalContentOffset + (self.view.frame.size.width/2)) / (widthStart * 2)  //for zooming at the middle of the screen

originalNumberOfCellsToOffset = (gesture.location(ofTouch: 0, in: sectionSequenceCollectionView).x + gesture.location(ofTouch: 1, in: sectionSequenceCollectionView).x) / (widthStart * 2)

关于ios - 捏缩放后保持 collectionView 单元格位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37622366/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com