ios - 有没有办法让导航栏跨多个 View ?

标签 ios swift xcode navigationbar

所以我有 2 个 View ,当我单击“转到第二个 View ”时,导航栏应该是固定的,唯一应该移动的部分是导航栏下方的 View 。 swift 是否有可能通过 Storyboard或以编程方式允许这样做?

最佳答案

是的。有。

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。像下面的示例一样对其进行子类化:

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。设置导航

只需将 ViewController 嵌入到 UINavigationController 中。

关于ios - 有没有办法让导航栏跨多个 View ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52934910/

相关文章:

ios - 如何在迦太基上安装旧版本

ios - 如何更改 WKWebView 中的最小和最大缩放比例?

ios - iPhone SDK : UIWebView crash

swift - 当数组的内容属于不同类型时,如何填充多个 TableView 部分?

xcode - Swift 中的自定义类引用

ios - 使用 Grand Central Dispatch IOS Swift Xcode 6.3.1 的问题

ios - 源类型 1 不可用

ios - iOS 编程支持的实时视频流格式

ios - 如何让iOS后台应用程序根据位置信息进行通知

swift - 导航按钮 用户位置