如何在 Swift Xcode 中创建自定义导航栏?

Posted

技术标签:

【中文标题】如何在 Swift Xcode 中创建自定义导航栏?【英文标题】:How to create a custom navigation bar in Swift Xcode? 【发布时间】:2017-10-31 10:20:48 【问题描述】:

我正在为我的 ios 毕业项目开发一个聊天应用程序。我设计了如下导航栏:

现在我正在尝试在我的 Xcode 项目中开发上述图形,但我不知道这是否是实现此目的的正确方法,并且不像图形那样得到它。

我正在使用一个 xib 文件,我使用它的一个实例将其加载到我的 ViewController.swift 中。不如将其添加为navigationItemtitleView

let helperView = HelperView()
navigationItem.titleView = helperView

这是上面代码sn-p的结果:

这个结果的问题是它与左栏按钮项目重叠,另一个我仍然没有弄清楚的问题是,如果消息气泡可以有动态高度,当它有多行时(最大值为3 行)。

有没有人在 Xcode 中使用过这种设计,这是正确的方法,还是有更好的方法来实现。也许是一个自定义 UINavigationController 类?

【问题讨论】:

【参考方案1】:

尝试创建您想要的整个导航视图,即宽度等于视图,然后尝试使用此代码添加它

    navigationController?.navigationBar.setBackgroundImage(UIImage(), for: .default)
    navigationController?.navigationBar.shadowImage = UIImage()
    navigationController?.navigationBar.backgroundColor = .clear

    navigationController?.view.insertSubview(subview, belowSubview: navigationController?.navigationBar)

它会让你的导航栏变得不可见,但仍然显示栏按钮

更新,来自 dimpiax

但最好覆盖您的 UINavigationController 类,并在 viewDidLoad 中设置视图

navigationBar.shadowImage = UIImage()
navigationBar.setBackgroundImage(UIImage(), for: .default)
navigationBar.backgroundColor = .clear

并依赖于 viewController 的视图 - 显示特定视图。

【讨论】:

所以如果我理解正确的话。我应该在我的 Xib 文件中正确创建头像和消息气泡,而不是在 viewDidAppear 函数中添加上述代码?子视图应该是什么? 子视图是您要添加的视图,在本例中是您的helperView。您可以在viewDidLoad 中添加上述代码,但将指针变量保留到您的helperView 以调整viewDidLayoutSubview 中的框架大小 好的,关于指针变量的最后一部分是什么意思?你的意思是它的框架应该根据它的内容调整大小吗? 我的意思是,如果您在viewDidAppear 中添加此代码,它可能会出现闪烁,添加viewDidLoad 那么它可能有错误的框架,这就是您可能想要声明@ 的原因987654331@ 在您的视图控制器范围内更改其框架在 viewDidLayoutSubview 那么添加上述代码的最佳方式是在 de viewdidLayoutSubview 函数中?对不起,如果我理解错了。【参考方案2】:
// --------------------------------------------------------
// MARK:- Navigation SetUp
// --------------------------------------------------------

private func _navigationBarSetUp()
    
    ///# Navigatoin bar and title #///
    
    navigationController?.navigationBar.isHidden = false
    navigationItem.title = vEditScreenName
    navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor : ColorTheme.white, NSAttributedString.Key.font: UIFont(descriptor: UIFontDescriptor(name: "Poppins-Regular", size: 20), size: 20)]
    self.view.backgroundColor = ColorTheme.vidBoomBrandPurple
    
    ///# Navigation bar back button #///
    
    let btnBack = UIButton(frame: CGRect(x: 0, y: 0, width: 25, height: 25))
    btnBack.setImage(UIImage(named: "icon_back_arrow"), for: .normal)
    btnBack.addTarget(self, action: #selector(_handlebtnBackTapped), for: .touchUpInside)
    navigationItem.leftBarButtonItem = UIBarButtonItem(customView: btnBack)
    
    ///# Navigation bar explore button #///
    
    let btnExport = UIButton(frame: CGRect(x: 0, y: 0, width: 80, height: 25))
    btnExport.setTitle("Export", for: .normal)
    btnExport.backgroundColor = .orange
    btnExport.layer.cornerRadius = 18
    btnExport.addTarget(self, action: #selector(_handleBtnExportTapped), for: .touchUpInside)
    navigationItem.rightBarButtonItem = UIBarButtonItem(customView: btnExport)



// --------------------------------------------------------
// MARK:- UIBarButtonItem Action
// --------------------------------------------------------

@objc fileprivate func _handlebtnBackTapped() 
    self.player.stop()
    navigationController?.popViewController(animated: true)
    navigationController?.navigationBar.isHidden = true


@objc func _handleBtnExportTapped()
    self.player.stop()
    let svc = ShareVideoVC(nibName: "ShareVideoVC", bundle: nil)
    svc.videoString = videoString
    saveFile()
    self.navigationController?.pushViewController(svc, animated: true)

【讨论】:

你能补充一些关于如何使用这个代码的细节吗?这些方法应该放在哪里,我们是否需要从某个位置/地方手动调用它们? 将此代码添加到 ViewController 类但不在 viewdidload 中并调用 viewdidload 中的函数。

以上是关于如何在 Swift Xcode 中创建自定义导航栏?的主要内容,如果未能解决你的问题,请参考以下文章

如何在Xcode + Swift 4中创建自定义UIBarButtonItem类?

如何在 Xcode 中创建自定义 UIView?

如何在android中创建自定义导航抽屉

在 Xcode 中创建自定义模板 - 如何根据复选框制作所需的选项?

如何在 Swift Combine 中创建自定义链?

iOS - 如何在没有第三方框架的情况下在 Swift 中创建自定义动画横幅