简体   繁体   English

有没有办法让导航栏跨多个视图?

[英]Is there a way to keep the navigation bar across multiple views?

So I have 2 views and when I click on "Go to second view", The navigation bar should be fixed and the only part that should be moving is the view below the Navigation Bar.所以我有 2 个视图,当我点击“转到第二个视图”时,导航栏应该是固定的,唯一应该移动的部分是导航栏下方的视图。 Is there a possibility that swift allows this either with storyboards or programmatically? swift 是否有可能通过情节提要或以编程方式允许此操作?

Yes.是的。 There is.有。

1. Create PageViewController.swift and paste the code below there 1. 创建PageViewController.swift并粘贴下面的代码

//
//  Copyright © 2018 fewlinesofcode.com All rights reserved.
//
import UIKit

class PageViewController: UIPageViewController {
    fileprivate(set) var currentPageIndex: Int = 0
    
    var pages = [UIViewController]()
    
    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)
        
        if let firstViewController = page(at: currentPageIndex) {
            setViewControllers([firstViewController], direction: .forward, animated: false, completion: { completed in })
        }
    }
    
    func resetIndex() { currentPageIndex = 0 }
    
    func page(at index: Int) -> UIViewController? {
        guard index >= 0 && index < pages.count else { return nil }
        return pages[index]
    }
}

extension PageViewController: UIPageViewControllerDataSource {
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerBefore viewController: UIViewController) -> UIViewController? {
        guard let pageIndex = pages.index(of: viewController), currentPageIndex != 0 else {
            return nil
        }
        currentPageIndex = pageIndex
        currentPageIndex -= 1
        return page(at: currentPageIndex)
    }
    
    func pageViewController(_ pageViewController: UIPageViewController, viewControllerAfter viewController: UIViewController) -> UIViewController? {
        guard let pageIndex = pages.index(of: viewController) else {
            return nil
        }
        currentPageIndex = pageIndex + 1
        
        if currentPageIndex == pages.count {
            return nil
        }
        return page(at: currentPageIndex)
    }
    
    func presentationCount(for pageViewController: UIPageViewController) -> Int {
        return pages.count
    }
    
    func presentationIndex(for pageViewController: UIPageViewController) -> Int {
        return currentPageIndex
    }
}

extension PageViewController {
    func showPrev(completion: ((Bool) -> Void)? = nil) {
        guard currentPageIndex > 0 else { return }
        currentPageIndex -= 1
        setViewControllers([pages[currentPageIndex]], direction: .reverse, animated: true, completion: completion)
    }
    
    func showNext(completion: ((Bool) -> Void)? = nil) {
        guard currentPageIndex < pages.count - 1 else { return }
        currentPageIndex += 1
        setViewControllers([pages[currentPageIndex]], direction: .forward, animated: true, completion: completion)
    }
}

2. Subclass it like in the sample below: 2. 像下面的示例一样对其进行子类化:

class ViewController: PageViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(_ animated: Bool) {
        super.viewDidAppear(animated)
        
        setupChildViewControllers()
    }
    
    private func setupChildViewControllers() {
        let vc1 = <Instantiate your VC 1>
        let vc2 = <Instantiate your VC 2>
        
        pages = [
            vc1, vc2
        ]
    }
}

3. Setup navigation 3.设置导航

Just embed ViewController in UINavigationController .只需在UINavigationController嵌入ViewController

Each view controller has it's own navigation bar execution.每个视图控制器都有自己的导航栏执行。 The only way this would be possible is instead of moving to another view controller, you could create a subclass of UIView, and present a new UIView upon clicking that button by adding it to the subview of the base view controller.唯一可行的方法是不要移动到另一个视图控制器,您可以创建 UIView 的子类,并在单击该按钮时通过将其添加到基本视图控制器的子视图来呈现一个新的 UIView。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM