这是我的第一篇文章,如果我的措辞不正确,我深表歉意。如果需要的话,我很乐意澄清。
我有一个pageViewController,它提供的每个viewController都包含一个scrollView,它显示应用程序内照片库中的imageView(与在照片应用程序中放大照片然后滑动图像集合非常相似)。我已经通过捏合手势实现了放大和缩小,通常一切正常,但是,当我从一个图像滑动到下一个图像,然后返回到原始图像,然后尝试向前或向后滑动时, View 会“卡住”。为了更好地说明这一点,假设您在图库中选择图像 2。如果您滑动到图像 3,然后滑动回图像 2,向图像 1 或图像 3 滑动会显示您要访问的图像的一小部分,然后快速返回到图像 2。
快速捏合可将图像缩小一点,然后将其锁定回屏幕宽度,这样您就可以再次自由地向前或向后缩放。我尝试在 viewDidAppear 中添加一些代码来快速缩小图像,然后让它弹回屏幕边界来模拟此手势,但正如预期的那样,您可以看到每次将新图像放在屏幕上时都会发生调整屏幕,我希望滑动流畅。
任何有关解决此问题的方法的想法将不胜感激。我已经阅读了Apple关于scrollViews和pageViews以及它们相关的委托(delegate)和数据源的文档,但一直无法找到这个问题的根源,尽管我可能只是忽略了一些东西。
如上所述,如果我可以对当前问题进行任何澄清,请告诉我。提前致谢。
最佳答案
我在同一问题上挣扎了一段时间,并追踪到缩放,最终在缩放后将内容居中时出现错误。我的大部分帖子都是用 Swift (2.1) 编写的,但我的主要解决方案的链接是用 Obj-C 编写的。我有两个答案:
您可以在 viewDidLoad()
(或 Obj-C 等效项)中设置 scrollView.bouncesZoom = false
。这会阻止 UIScrollView
缩放超过最小缩放比例,从而导致用户在图像处于最小缩放比例时无法通过捏合来缩小图像。
然而,更优雅的解决方案来自 https://stackoverflow.com/a/2887298/2490299 。最初,我的 centerScrollViewContents()
(又名链接答案中的 scrollViewDidZoom()
)是:
func centerScrollViewContents() {
let boundsSize = scrollView.bounds.size
var contentsFrame = imageView.frame
if contentsFrame.size.width < boundsSize.width {
contentsFrame.origin.x = (boundsSize.width - contentsFrame.width) / 2.0
} else {
contentsFrame.origin.x = 0.0
}
if contentsFrame.size.height < boundsSize.height {
contentsFrame.origin.y = (boundsSize.height - contentsFrame.height) / 2.0
} else {
contentsFrame.origin.y = 0.0
}
imageView.frame = contentsFrame
}
显然,通过更改框架使内容居中导致了此问题。作为引用,与上面链接的答案等效的 Swift 是:
func scrollViewDidZoom(scrollView: UIScrollView) {
let offsetX = max((scrollView.bounds.size.width - scrollView.contentSize.width) * 0.5, 0.0)
let offsetY = max((scrollView.bounds.size.height - scrollView.contentSize.height) * 0.5, 0.0)
imageView.center = CGPointMake(scrollView.contentSize.width * 0.5 + offsetX,
scrollView.contentSize.height * 0.5 + offsetY)
}
如果您碰巧遇到了与我相同的问题,希望这对您有所帮助;听起来很相似。
关于ios - (Objective-C) pageView中的viewController在来回分页时得到 "stuck",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30308960/