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

标签 ios objective-c iphone uiscrollview uipageviewcontroller

这是我的第一篇文章,如果我的措辞不正确,我深表歉意。如果需要的话,我很乐意澄清。

我有一个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/

相关文章:

objective-c - 向 UIViewController 及其所有子类添加属性

objective-c - 在 Objective-C 中,将 NSIntegers 添加在一起的最佳方法是什么?

ios - 在模拟器和本地设备上获取不同的时间格式 - Swift iOS

ios - 用 TableViewController 中的日期选择器替换 iOS7 键盘

ios - UI 自动化命令行配置通用应用程序的模拟器

ios - 在 iOS 中终止通话

iphone - 如何设置 UIWebView 起始偏移量

ios - 在 Xamarin.iOS DYLD 中集成时,代码签名对于 iOS Objective C Umbrella 框架无效,库未加载 : App Crash

iphone - 在哪里初始化 iPhone 应用程序默认值

iphone - 在 UIWebView 中同步加载 html 内容