PageViewController 显示其他视图控制器的一部分

Posted

技术标签:

【中文标题】PageViewController 显示其他视图控制器的一部分【英文标题】:PageViewController shows part of other viewcontroller 【发布时间】:2019-02-03 10:55:32 【问题描述】:

我有一个UIPageViewController 和 2 个UIViewControllers,它们都有一个UIImageView 作为背景,内容模式设置为scaleAspectFill。出于某种原因,这会导致第二个UIViewController 在第一个滚动到第二个UIViewController 时部分可见,而不是滚动回第一个UIViewController

复制项目可以在这里找到:https://github.com/Jasperav/PageViewControllerGlitch。代码也在照片下方。

照片(空格是第一个UIViewController,绿色部分是第二个UIViewController):

代码(我不使用故事板,对于具有正确窗口的复制路径,请使用 github 链接):

import UIKit

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate 

    private let pageViewControllers: [UIViewController] = [VC1(), VC2()]

    init() 
        super.init(transitionStyle: .scroll, navigationOrientation: .horizontal, options: nil)

        dataSource = self
        delegate = self

        setViewControllers([pageViewControllers.first!], direction: .forward, animated: false, completion: nil)
    

    required init?(coder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

    func presentationCount(for pageViewController: UIPageViewController) -> Int 
        return pageViewControllers.count
    

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? 
        guard let index = pageViewControllers.index(of: viewController), index > 0 else  return nil 

        let previousIndex = index - 1

        return pageViewControllers[previousIndex]
    

    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? 
        guard let index = pageViewControllers.index(of: viewController), (index + 1) != pageViewControllers.count else  return nil 

        return pageViewControllers[index + 1]
    


class VC: UIViewController 
    init(background: UIImage) 
        super.init(nibName: nil, bundle: nil)

        let backgroundImageView = UIImageView(image: background)

        backgroundImageView.contentMode = .scaleAspectFill

        view.addSubview(backgroundImageView)

        backgroundImageView.translatesAutoresizingMaskIntoConstraints = false

        backgroundImageView.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
        backgroundImageView.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
        backgroundImageView.leadingAnchor.constraint(equalTo: view.leadingAnchor).isActive = true
        backgroundImageView.trailingAnchor.constraint(equalTo: view.trailingAnchor).isActive = true
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


class VC1: VC 
    init() 
        super.init(background: #imageLiteral(resourceName: "bg1"))
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    


class VC2: VC 
    init() 
        super.init(background: #imageLiteral(resourceName: "bg2"))
    

    required init?(coder aDecoder: NSCoder) 
        fatalError("init(coder:) has not been implemented")
    

【问题讨论】:

【参考方案1】:

当你使用AspectFill作为内容模式时,如果图片大于UImageView的尺寸,图片就会溢出。要解决此问题,您可以剪切其子视图:

backgroundImageView.contentMode = .scaleAspectFill
backgroundImageView.clipsToBounds = true

另一种解决方案是尝试另一种内容模式,例如.scaleToFill。 希望这会有所帮助,我刚刚在您的演示项目中尝试了这个解决方案并且都有效。

【讨论】:

我应该知道这一点 :P 谢谢! :)

以上是关于PageViewController 显示其他视图控制器的一部分的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在 containerView 中的 PageViewController 显示前一个视图的小边距

隐藏/显示 PageViewController 中特定视图控制器的状态栏 [关闭]

如何让 PageViewController 显示不同的 ViewController

图像的集合视图和弹出窗口上的单元格显示图像,也可以滚动查看其他图像

如何在 SwiftUI 中的 PageViewController 中传递一些视图?

PageViewController 页面指示器向上推视图