ios - 防止滑动 UIPageViewController 时出现的白色间隙

标签 ios iphone swift uiimageview uipageviewcontroller

我以这种方式实现了 UIPageViewController:

Screenshot1

GalleryViewController:是PageViewController的容器

PageViewController:是我将它作为 subview 添加到 GalleryViewController 的 pageViewController。

PageContentViewController:我将 UIImageView 放入其中作为页面 View Controller 的内容。

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

white gap

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

full screen

这是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
}

}

我该怎么做才能防止滑动时出现拉伸(stretch)和白色间隙?

更新:

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

最佳答案

错误的根源是您的 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 的布局引用了顶部布局指南,而顶部布局指南在计算自动布局之前和之后可能具有不同的值,所以您有这个错误。

所以要解决这个问题,您可以更改 ImageView 的约束并使它们相对于父 View (因为 pageContentViewController 就像一个 subview ,而 pagerViewController 将管理顶部和底部边距),如下所示:

enter image description here

enter image description here enter image description here

有了它你可以修复这个错误,但要小心你应该在你的 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])

最好的问候,

关于ios - 防止滑动 UIPageViewController 时出现的白色间隙,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29198160/

相关文章:

ios - 通过 webview 和 CGPDFDocument 创建的 PDF 颜色很奇怪,但不在预览中

ios - 将仅限 iphone 的应用程序提交到应用程序商店?

ios - XCode 8 奇怪的 Playground 错误,无法查找符号

ios - 了解 "firstBaseLine"与 "baseLine"AutoLayout 约束

iphone - NSMutableDictionary设置值在iOS 5上崩溃

swift - 当我尝试运行代码时出现 swift 错误

objective-c - 使用 NSDate 获取每年 7 月的日期

ios - 如何在 iOS 中为圆形路径上的标签设置动画?

ios - 使用配对的蓝牙设备以编程方式解锁 iphone?

iphone - 如何在iPhone中将CSV格式转换为NSData或NSString?