【问题标题】:Preventing the white gap that appears on swiping UIPageViewController防止在滑动 UIPageViewController 时出现白色间隙
【发布时间】:2015-05-25 17:30:24
【问题描述】:

我已经以这种方式实现了 UIPageViewController:

GalleryViewController:是PageViewController的容器

PageViewController: 是我将它作为子视图添加到 GalleryViewController 的 pageViewController。

PageContentViewController: 我把 UIImageView 放进去作为页面视图控制器的内容。

一切都很顺利,但是当我在图像之间滑动时,会发生奇怪的事情。上行出现白色缺口。

奇怪的是当我完成滚动时它会自动拉伸。

这是GalleryViewController的代码,是PageViewController的容器:

import UIKit

class PageViewController: UIViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {

var startIndex:Int = 0

var pageViewController : UIPageViewController!

override func viewDidLoad() {
    self.navigationController?.hidesBarsOnTap = true;
    reset()
}

func reset() {
    /* Getting the page View controller */
    pageViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageViewController") as UIPageViewController
    self.pageViewController.dataSource = self

    let pageContentViewController = self.viewControllerAtIndex(0)
    self.pageViewController.setViewControllers([pageContentViewController!], direction: UIPageViewControllerNavigationDirection.Forward, animated: true, completion: nil)

    self.pageViewController.view.frame = CGRectMake(0, 0, self.view.frame.width, self.view.frame.height)
    self.addChildViewController(pageViewController)
    self.view.addSubview(pageViewController.view)
    self.pageViewController.didMoveToParentViewController(self)
    println("\(startIndex) start index")
}


override func didReceiveMemoryWarning() {
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.
}

func pageViewController(pageViewController: UIPageViewController, viewControllerAfterViewController viewController: UIViewController) -> UIViewController? {

    var index = (viewController as PageContentViewController).pageIndex!
    index++
    if(index >= Constants.Statics.images.count){
        return nil
    }
    return self.viewControllerAtIndex(index)

}

func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {

    var index = (viewController as PageContentViewController).pageIndex!
    if(index <= 0){
        return nil
    }
    index--
    return self.viewControllerAtIndex(index)

}

func viewControllerAtIndex(index : Int) -> UIViewController? {
    if((Constants.Statics.images.count == 0) || (index >= Constants.Statics.images.count)) {
        return nil
    }
    let pageContentViewController = self.storyboard?.instantiateViewControllerWithIdentifier("PageContentViewController") as PageContentViewController
    pageContentViewController.pageIndex = index
    return pageContentViewController
}

}

我能做些什么来防止这种拉伸和滑动时出现白色间隙?

更新:

发生了一件奇怪的事情,我把pageViewController的Transition Style改成Page Curl,问题没有出现。听起来像是关于滚动!

【问题讨论】:

    标签: ios iphone swift uiimageview uipageviewcontroller


    【解决方案1】:

    因此,在动画发生之前,视图的框架似乎是不正确的。尝试在框架开始出现在屏幕上之前对其进行设置。比如:

    func pageViewController(pageViewController: UIPageViewController, viewControllerBeforeViewController viewController: UIViewController) -> UIViewController? {
    
        var index = (viewController as PageContentViewController).pageIndex!
        if(index <= 0){
            return nil
        }
        index--
    
        // Setting up the new view's frame
        var newVC = self.viewControllerAtIndex(index)
        newVC.view.frame = self.pageViewController.view.bounds
        return newVC
    }
    

    【讨论】:

    • 它不起作用,现在它以更小的范围显示图像,甚至比以前更小,而且它也可以拉伸更多
    【解决方案2】:

    自动拉伸是因为 ImageView 实例不受宽高比限制。在您的 PageContentViewController 中,为您的图像指定 contentMode 值以解决问题。例如:

    self.imageView.contentMode = UIViewContentModeScaleAspectFit
    

    【讨论】:

    • 在我将内容模式设置为缩放纵横比后仍在拉伸
    【解决方案3】:

    你试过了吗?您应该首先选择您的内容视图控制器。注意:点击控制器,而不是视图

    1. 取消选中调整滚动视图插图
    2. 取消选中顶部栏下
    3. 取消选中底部栏下

    【讨论】:

    • 我将 pageViewController 设置在另一个视图控制器中作为插座。我在包含 pageViewController 的 viewController 中设置了您的 sn-p。但它仍然没有工作
    • 我在您的代码中看到了这一点。我希望您在情节提要中使用 PageContentViewController 进行此设置。页面视图控制器的子控制器通常在滑动期间自动调整大小。这就是我们需要进行此设置的原因。
    • 发生了奇怪的事情,我把pageViewController的Transition Style改成page Curl,没有出现问题,所以是关于滚动的!
    • 您是否可以在 github 上分享您的项目,以便我可以重现此问题?
    【解决方案4】:

    看起来像是布局问题。

    由于UIPageViewController.Scroll 类型使用UIScrollView 来实现,

    尝试将self.automaticallyAdjustsScrollViewInsets = false 添加到您的viewDidLoad

    如果不起作用,请尝试删除self.navigationController?.hidesBarsOnTap = true

    如果还是不行,请提供一个演示项目,以便我找出问题所在。

    【讨论】:

      【解决方案5】:

      bug 的根源在于你的 UIImageView 的约束。

      开始滚动时,只调用viewWillAppear,还没有计算autolayout,当滚动结束,view显示出来,view开始计算autolayout,viewDidAppear发生在autolayout完成后。

      您可以通过在PageContentViewController 中添加以下代码来检查

        override func viewDidLoad() {
          super.viewDidLoad()
      
          imageView.image = UIImage(named: "UpcomingGamesBg")
          println("viewDidLoad imageView Frame : \(imageView.frame) pageIndex : \(pageIndex)")
        }
      
        override func viewWillAppear(animated: Bool) {
          super.viewWillAppear(animated)
      
          println("viewWillAppear imageView Frame : \(imageView.frame) pageIndex : \(pageIndex)")
        }
      
        override func viewDidAppear(animated: Bool) {
          super.viewDidAppear(animated)
      
          println("viewDidAppear imageView Frame : \(imageView.frame) pageIndex : \(pageIndex)")
        }
      

      因为,你的 imageView 的布局参考了顶部布局指南,而顶部布局指南在计算自动布局之前和之后可能有不同的值,所以你有这个错误。

      因此,为了解决这个问题,您可以更改图像视图的约束并使它们与父视图相关(因为 pageContentViewController 就像一个子视图,而 pagerViewController 将管理顶部和底部边距),就像这样:

      这样你可以修复这个错误,但要小心你应该在你的 pageViewController.view 中添加一些约束

      更新

      例如要支持navigationBar / TabBar,你应该在viewDidLoad(view.addSubview(pageViewController.view)之后)添加一些约束:

            pageViewController.view.setTranslatesAutoresizingMaskIntoConstraints(false)
      
          let topConstraint = NSLayoutConstraint(item: pageViewController.view, attribute: NSLayoutAttribute.Top, relatedBy: NSLayoutRelation.Equal, toItem: topLayoutGuide, attribute: NSLayoutAttribute.Bottom, multiplier: 1.0, constant: 0)
          let bottomConstaint = NSLayoutConstraint(item: pageViewController.view, attribute: NSLayoutAttribute.Bottom, relatedBy: NSLayoutRelation.Equal, toItem: bottomLayoutGuide, attribute: NSLayoutAttribute.Top, multiplier: 1.0, constant: 0)
          let leadingConstraint = NSLayoutConstraint(item: pageViewController.view, attribute: NSLayoutAttribute.Leading, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Leading, multiplier: 1.0, constant: 0)
          let trailingConstraint = NSLayoutConstraint(item: pageViewController.view, attribute: NSLayoutAttribute.Trailing, relatedBy: NSLayoutRelation.Equal, toItem: view, attribute: NSLayoutAttribute.Trailing, multiplier: 1.0, constant: 0)
      
          view.addConstraints([topConstraint, bottomConstaint, leadingConstraint, trailingConstraint])
      

      最好的问候,

      【讨论】:

      • 我的 UIImageView 也在滚动视图中,我将它用于缩放功能。我也为 0 做了滚动视图约束,仍然面临同样的事情
      • 这是一个大项目,我将上传我用于这部分的文件
      • 当我创建一个新项目以将其上传到 github 上时,我发现问题正是您在此答案中解释的问题,我将您为 UIImageView 解释的相同约束添加到容器 scrollView,即解决了问题!.. 谢谢哈姆扎
      【解决方案6】:

      在这里查看绝对示例:https://github.com/dimpiax/UIPageViewControllerScrolling

      但是如果你想在滑动时去除空白,你可以去除反弹,例如:

      for value in view.subviews {
          if let scrollView = value as? UIScrollView {
              scrollView.bounces = false
          }
      }
      

      【讨论】:

      • 我的viewPageController的内容是包含滚动视图的ViewController,滚动视图里面有UIImageView,提供可缩放的uiimage,所以我已经禁用了弹跳,问题发生在pageViewController的某个地方
      • 需要在UIPageViewController里面禁用
      • 谢谢,这确实很有帮助,但你现在需要更新到最新的swift。
      • @windsound 我想更新它的常用方法。但现在也将在 Swift 2 下更新它。今天晚些时候去那里看看。
      • @windsound 有新版本,还有禁用弹跳的配置
      【解决方案7】:

      将 imageView 的 contentMode 设置为 AspectFill ...

      【讨论】:

      • 你能详细说明一下吗?
      • 我尝试了所有可能的 contentMode,但没有成功
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2019-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多