防止出现在UIPageViewController上的白色空白

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

Screenshot1

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 ,问题没有出现。 听起来像是关于滚动!

错误的来源是你的UIImageView的约束。

当你开始滚动时,只有viewWillAppear被调用,并且自动布局还没有被计算,当滚动完成,并且显示视图时,视图开始计算自动布局,而viewDidAppear在自动布局完成后发生。

你可以通过在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将pipe理顶部和底部边距),就像这样:

在这里输入图像说明

在这里输入图像说明在这里输入图像说明

有了这个,你可以修复这个bug,但要小心,你应该添加一些限制到你的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]) 

最好的祝福,

检查确定的例子在这里: https : //github.com/dimpiax/UagentControllerScrolling

但是如果你想删除空白的空白,你可以删除反弹,例如:

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

自动伸展是因为ImageView实例不受约束方面的限制。 在你的PageContentViewController ,指定你的图片的contentMode值来解决这个问题。 例如:

 self.imageView.contentMode = UIViewContentModeScaleAspectFit 

所以看起来,animation发生之前,视图的框架是不正确的。 尝试设置框架,然后开始屏幕上。 就像是:

 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 } 

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

  1. 取消选中调整滚动视图插图
  2. 取消选中“顶部酒吧”
  3. 取消选中“底部酒吧”

在这里输入图像说明

看起来像一个布局问题。

由于具有.Scrolltypes的.Scroll使用UIScrollView来制作它,

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

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

如果它不能再工作,请提供一个演示项目,以便我能弄清楚什么是错的。

将imageView的contentMode设置为AspectFill …