Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift 如何将PageViewController设置为覆盖整个屏幕而不是模态?_Swift_Uipageviewcontroller - Fatal编程技术网

Swift 如何将PageViewController设置为覆盖整个屏幕而不是模态?

Swift 如何将PageViewController设置为覆盖整个屏幕而不是模态?,swift,uipageviewcontroller,Swift,Uipageviewcontroller,我正在为我的应用程序实现一个UIPageViewController,试图构建一个类似Tinder的UI,在这个UI中,你可以左右滑动,不仅喜欢或不喜欢一个人,还可以浏览不同的屏幕,如聊天屏幕、个人资料屏幕、匹配屏幕等 在我的例子中,登录后,将弹出一个包含4个其他UIViewController的UIPageViewController 但是,UIPageViewController是模态的,不能覆盖整个屏幕(因为顶部有一个小间隙,允许用户向下滑动模态并将其移开)。 我尝试使用如下代码: sel

我正在为我的应用程序实现一个UIPageViewController,试图构建一个类似Tinder的UI,在这个UI中,你可以左右滑动,不仅喜欢或不喜欢一个人,还可以浏览不同的屏幕,如聊天屏幕、个人资料屏幕、匹配屏幕等

在我的例子中,登录后,将弹出一个包含4个其他UIViewController的UIPageViewController

但是,UIPageViewController是模态的,不能覆盖整个屏幕(因为顶部有一个小间隙,允许用户向下滑动模态并将其移开)。 我尝试使用如下代码:

self.window = UIWindow(frame: UIScreen.main.bounds)
    if let window = self.window {
        window.rootViewController = PageViewController()
        window.makeKeyAndVisible()
    }
func presentPageVC() {
    guard let first = controllers.first else {
        return
    }
    
    let vc = UIPageViewController(transitionStyle: .scroll,
                                    navigationOrientation: .horizontal,
                                    options: nil)
    
    vc.delegate = self
    vc.dataSource = self
    vc.setViewControllers([first],
                            direction: .forward,
                            animated: true,
                            completion: nil)

    vc.modalPresentationStyle = .fullScreen // <- add this before presenting your ViewController

    present(vc, animated: true)
}
在我的AppDelegate上,或者在情节提要上设置全屏,但都不起作用

我不知道该怎么做? 或者也许UIPageViewController不是实现Tinder在屏幕间滑动导航风格的正确选择

无论如何,以下是我的PageViewController的代码:

import UIKit

class PageViewController: UIPageViewController, UIPageViewControllerDataSource, UIPageViewControllerDelegate {
   
    var controllers = [UIViewController]()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        let vc = TodayPicksViewController()
        controllers.append(vc)
        
        let vc1 = TopPicksViewController()
        vc1.view.backgroundColor = .yellow
        controllers.append(vc1)
        
        let vc2 = ChatViewController()
        vc2.view.backgroundColor = .gray
        controllers.append(vc2)
        
        let vc3 = (storyboard?.instantiateViewController(withIdentifier: String(describing: ProfileViewController.self)) as? ProfileViewController)!
        controllers.append(vc3)
        
    }
        
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        DispatchQueue.main.asyncAfter(deadline: .now()+2, execute: {
            self.presentPageVC()
        })
    }
    
    func presentPageVC() {
        guard let first = controllers.first else {
            return
        }
        
        let vc = UIPageViewController(transitionStyle: .scroll,
                                      navigationOrientation: .horizontal,
                                      options: nil)
        
        vc.delegate = self
        vc.dataSource = self
        vc.setViewControllers([first],
                              direction: .forward,
                              animated: true,
                              completion: nil)
        present(vc, animated: true)
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let index = controllers.firstIndex(of: viewController), index > 0 else {
            return nil
        }
        
        let before = index - 1
        
        return controllers[before]
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let index = controllers.firstIndex(of: viewController), index < (controllers.count - 1) else {
            return nil
        }
        
        let after = index + 1
        
        return controllers[after]
    }
}
导入UIKit
类PageViewController:UIPageViewController、UIPageViewControllerDataSource、UIPageViewControllerDelegate{
变量控制器=[UIViewController]()
重写func viewDidLoad(){
super.viewDidLoad()
让vc=TodayPicksViewController()
controllers.append(vc)
设vc1=TopPicksViewController()
vc1.view.backgroundColor=.yellow
控制器。追加(vc1)
设vc2=ChatViewController()
vc2.view.backgroundColor=.gray
控制器。附加(vc2)
让vc3=(故事板?.instanceeviewcontroller(带标识符:String(描述:ProfileViewController.self))作为?ProfileViewController)!
控制器。附加(vc3)
}
覆盖函数视图显示(u动画:Bool){
super.viewdide显示(动画)
DispatchQueue.main.asyncAfter(截止日期:.now()+2,执行:{
self.presentPageVC()
})
}
func presentPageVC(){
guard let first=控制器。其他优先{
返回
}
让vc=UIPageViewController(转换样式:。滚动,
导航方向:。水平,
选项:无)
vc.delegate=self
vc.dataSource=self
vc.setViewController([第一个],
方向:。向前,
是的,
完成:无)
当前(vc,动画:真)
}
func pageViewController(uPageViewController:UIPageViewController,viewController在viewController:UIViewController之前)->UIViewController{
guard let index=controllers.firstIndex(of:viewController),index>0{
归零
}
let before=索引-1
返回控制器[之前]
}
func pageViewController(pageViewController:UIPageViewController,viewController后的viewController:UIViewController)->UIViewController{
guard let index=controllers.firstIndex(of:viewController),index<(controllers.count-1)else{
归零
}
let after=index+1
返回控制器[之后]
}
}

默认情况下,当您在Swift中显示ViewController时,它不会覆盖全屏。要使其覆盖全屏,需要在ViewController上设置
modalPresentationStyle

因此,在您的
presentPageVC
方法中,您需要添加以下行:

vc.modalPresentationStyle = .fullScreen
因此,您的方法现在将如下所示:

self.window = UIWindow(frame: UIScreen.main.bounds)
    if let window = self.window {
        window.rootViewController = PageViewController()
        window.makeKeyAndVisible()
    }
func presentPageVC() {
    guard let first = controllers.first else {
        return
    }
    
    let vc = UIPageViewController(transitionStyle: .scroll,
                                    navigationOrientation: .horizontal,
                                    options: nil)
    
    vc.delegate = self
    vc.dataSource = self
    vc.setViewControllers([first],
                            direction: .forward,
                            animated: true,
                            completion: nil)

    vc.modalPresentationStyle = .fullScreen // <- add this before presenting your ViewController

    present(vc, animated: true)
}
func presentPageVC(){
guard let first=控制器。其他优先{
返回
}
让vc=UIPageViewController(转换样式:。滚动,
导航方向:。水平,
选项:无)
vc.delegate=self
vc.dataSource=self
vc.setViewController([第一个],
方向:。向前,
是的,
完成:无)

vc.modalPresentationStyle=.fullScreen//
vc
上设置模式演示样式您可以这样做
vc.modalPresentationStyle=.fullScreen
@Andrew它可以工作!谢谢!您应该在下面回答,所以我可以选择您作为接受的答案!再次感谢!