防止出现在UIPageViewController上的白色空白
我已经以这种方式实现了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
,问题没有出现。 听起来像是关于滚动!
错误的来源是你的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您的内容视图控制器 。 注意:点击控制器,而不是视图
- 取消选中调整滚动视图插图
- 取消选中“顶部酒吧”
- 取消选中“底部酒吧”
看起来像一个布局问题。
由于具有.Scroll
types的.Scroll
使用UIScrollView
来制作它,
尝试添加self.automaticallyAdjustsScrollViewInsets = false
到您的viewDidLoad
如果它不起作用,请尝试删除self.navigationController?.hidesBarsOnTap = true
如果它不能再工作,请提供一个演示项目,以便我能弄清楚什么是错的。
将imageView的contentMode设置为AspectFill …