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