Ios 防止滑动UIPageViewController时出现白色间隙

Ios 防止滑动UIPageViewController时出现白色间隙,ios,iphone,swift,uiimageview,uipageviewcontroller,Ios,Iphone,Swift,Uiimageview,Uipageviewcontroller,我以以下方式实现了UIPageViewController: GalleryViewController:是PageViewController的容器 PageViewController:是我将其作为子视图添加到GalleryViewController的PageViewController PageContentViewController:我将UIImageView放入其中,作为页面视图控制器的内容 一切都很顺利,但当我在图像之间滑动时,奇怪的事情发生了。有白色缺口出现在上方 奇怪的是

我以以下方式实现了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
}

}
导入UIKit
类PageViewController:UIViewController、UIPageViewControllerDataSource、UIPageViewControllerDelegate{
变量startIndex:Int=0
var pageViewController:UIPageViewController!
重写func viewDidLoad(){
self.navigationController?.hidesBarsOnTap=true;
重置()
}
函数重置(){
/*获取页面视图控制器*/
pageViewController=self.storyboard?.instanceeviewcontrollerwhiteIdentifier(“pageViewController”)作为UIPageViewController
self.pageViewController.dataSource=self
让pageContentViewController=self.viewControllerAtIndex(0)
self.pageViewController.SetViewController([pageContentViewController!],方向:UIPageViewControllerNavigationDirection.Forward,动画:true,完成: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)开始索引”)
}
重写函数didReceiveMemoryWarning(){
超级。我收到了记忆警告()
//处置所有可以重新创建的资源。
}
func pageViewController(pageViewController:UIPageViewController,viewControllerAfterViewController:UIViewController)->UIViewController{
变量索引=(viewController作为PageContentViewController)。pageIndex!
索引++
如果(索引>=常量.静态.图像.计数){
归零
}
返回self.viewControllerAtIndex(索引)
}
func pageViewController(pageViewController:UIPageViewController,viewController预览控制器viewController:UIViewController)->UIViewController{
变量索引=(viewController作为PageContentViewController)。pageIndex!
如果(索引UIViewController{
if((Constants.Statics.images.count==0)| |(index>=Constants.Statics.images.count)){
归零
}
让pageContentViewController=self.storyboard?.instanceeviewcontrollerwhiteIdentifier(“pageContentViewController”)作为pageContentViewController
pageContentViewController.pageIndex=索引
返回页面内容视图控制器
}
}
我能做些什么来防止划水时的拉伸和白色间隙

更新:


发生了一件奇怪的事情,我将pageViewController转换样式更改为
页面卷曲
,问题没有出现。听起来好像是关于滚动的!

因此在动画出现之前,视图的帧似乎不正确。请在帧开始出现在屏幕上之前尝试设置帧。类似于:

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
}
func pageViewController(pageViewController:UIPageViewController,viewControllerBeforeViewController viewController:UIViewController)->UIViewController{
变量索引=(viewController作为PageContentViewController)。pageIndex!

如果(索引自动拉伸是因为ImageView实例不受纵横比限制。在
PageContentViewController
中,为图像指定
contentMode
值以解决问题。例如:

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

您尝试过这些吗?您应该首先选择内容视图控制器。注意:单击控制器,而不是视图

  • 取消选中“调整滚动视图插入”
  • 在顶部栏下取消选中
  • 在底部栏下取消选中

  • 看起来像是布局问题

    由于
    UIPageViewController
    带有
    。滚动
    类型,请使用
    UIScrollView
    将其设置为

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

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


    如果它再次无法工作,请提供一个演示项目,这样我就可以找出问题所在。

    错误的根源是UIImageView的约束

    开始滚动时,仅调用ViewWillDisplay,并且尚未计算autolayout;当滚动完成并显示视图时,视图开始计算autolayout,并且ViewDidDisplay在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的布局指的是top layout guide,并且top layout guide在计算autolayout之前和之后可能具有不同的值,因此存在此错误

    因此,要解决这个问题,您可以更改图像视图的约束,并使其与父视图相关(因为pageContentViewController类似于子视图,pagerViewController将管理上边距和下边距),如下所示:

    有了它,您可以修复这个bug,但要小心,您应该在pageViewController.view中添加一些限制

    更新

    例如,为了支持导航栏/选项卡栏,您应该在viewDidLoad中添加一些约束(在
    view.addSubview(pageViewController.view)
    之后):


    致以最诚挚的问候,

    请在此处查看示例:

    但是,如果要在刷卡时删除空白,可以删除反弹,例如:for value in view.subviews { if let scrollView = value as? UIScrollView { scrollView.bounces = false } }