(Objective-C) viewController 在 pageView 中来回翻页时得到 "stuck"

(Objective-C) viewController's in pageView get "stuck" when paging back and forth

这是我的第一个 post,所以如果我用词有误,我深表歉意。如果需要,我很乐意澄清。

我有一个 pageViewController,它呈现的每个 viewController 都包含一个 scrollView,它显示来自应用程序内照片库的 imageView(非常类似于在照片应用程序中放大照片,然后滑动浏览图片)。我已经通过捏合手势实现了放大和缩小,通常一切正常,但是,当我从一个图像滑动到下一个图像,然后返回原始图像,然后尝试向前或向后滑动时,视图得到 "stuck".为了更好地说明这一点,假设您 select 图库中的图像 2。如果您滑动到图像 3,然后滑动回到图像 2,则向图像 1 或图像 3 滑动会显示您尝试到达的图像的一小部分,然后快速返回到图像 2。

快速捏合以将图像缩小一点并将其锁定回屏幕的宽度,这样您就可以再次自由地向前或向后缩放。我已经尝试在 viewDidAppear 中添加一些代码以快速缩小图像,然后让它快速回到屏幕边界以模拟此手势,但正如预期的那样,每次将新图像放在屏幕,我希望滑动顺畅。

如有任何解决此问题的想法,我们将不胜感激。我已经阅读了 Apple 关于 scrollViews 和 pageViews 以及它们相关的委托和数据源的文档,但未能找到这个问题的根源,尽管我可能只是忽略了一些东西。

如上所述,如果我可以就手头的问题提供任何说明,请告诉我。提前致谢。

我在同一个问题上苦苦挣扎了一段时间,并追踪到缩放,最终在缩放后居中内容时出错。我的大部分 post 在 Swift (2.1) 中,但我主要解决方案的 link 在 Obj-C 中。我有两个答案:

您可以在您的 viewDidLoad()(或您的 Obj-C 等效项)中设置 scrollView.bouncesZoom = false。这可以防止 UIScrollView 缩放超过最小缩放比例,这样用户就无法在图像处于最小缩放比例时通过捏合来缩小图像。

然而,更优雅的解决方案来自 。最初,我的 centerScrollViewContents()(又名 linked 答案中的 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 相当于上面 link 的答案是:

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)
}

如果您碰巧遇到与我相同的问题,希望这对您有所帮助;听起来很像。