如何以编程方式与UINavigationController默认集成的UIToolbar进行交互?

时间:2017-10-21 09:06:26

标签: ios swift uinavigationcontroller uitoolbar swift4

我正在研究与UINavigationController默认集成的UIToolbar进行交互的最佳方式。

我只想以编程方式在我的应用程序底部添加一个静态视图,当我刚刚意识到UINavigationController已经集成了UIToolbar时。

注意:所有这些都不使用Storyboard或Xib文件。

AppDelegate.swift:

<section id="fullpage">

</section>

html, body {
    height:100%;
    margin:0;
}

#fullpage { 
    background-image: url("sakura.png");
}

我展示了这段代码,让您了解到目前为止我一直关注的方法 ....这就是我的测试应用程序现在的样子:

Application example where you can see the UIToolbar (the blue segment) that comes integrated in UINavigationController by default.

...蓝色部分对应于我正在谈论的UIToolbar,UINavigationController默认集成的那个。

此UIToolbar可以替换为自定义实现吗? ...或者更好的方法是通过我的自定义 UINavigationController 直接与此UIToolbar交互,然后添加我需要的所有子视图? / p>

1 个答案:

答案 0 :(得分:0)

我选择不继承UIToolbar,但我发现更方便(快速实施)直接与&#34; 工具栏&#34;属性(对内置工具栏的引用)在UINavigationController中默认集成

我已经阅读过此工具栏适用于想要从工具栏中显示操作表的客户端,我也不应该直接修改UIToolbar对象,并且通过自定义管理此工具栏的内容查看与导航控制器关联的控制器。 (确实是Apple的话。)

但在我的特殊情况下,我不需要展示任何动作。我只想使用这个工具栏向用户显示信息,更像是一个状态栏,最终将其隐藏在特定的视图控制器中:使用布尔属性 isToolbarHidden 非常容易实现。

这就是我的所作所为:在我的UITableViewController的自定义实现中,我添加了一些UILabel,我直接添加为工具栏的子视图......使用必要的自动布局配置。

MyTableViewController.swift:

import UIKit

class MyTableViewController: UITableViewController {

let monthlyLabel: UILabel = {

        let label = UILabel()

        label.translatesAutoresizingMaskIntoConstraints = false

        label.font = UIFont.boldSystemFont(ofSize: 14)

        label.sizeToFit()

        label.textAlignment = .left

        label.text = "Monthly:"

        return label

    }()

    let fixedMonthlyExpenses: UILabel = {

        let label = UILabel()

        label.translatesAutoresizingMaskIntoConstraints = false

        label.font = UIFont.systemFont(ofSize: 14)

        label.sizeToFit()

        label.textAlignment = .left

        return label

    }()

    let annuallyLabel: UILabel = {

        let label = UILabel()

        label.translatesAutoresizingMaskIntoConstraints = false

        label.font = UIFont.boldSystemFont(ofSize: 14)

        label.sizeToFit()

        label.textAlignment = .right

        label.text = "Annually:"

        return label

    }()

    let fixedAnnuallyExpenses: UILabel = {

        let label = UILabel()

        label.translatesAutoresizingMaskIntoConstraints = false

        label.font = UIFont.systemFont(ofSize: 14)

        label.sizeToFit()

        label.textAlignment = .right

        return label

    }()

    ...

    override func viewDidLoad() {

        super.viewDidLoad()

        navigationItem.title = "My Test"

        tableView.backgroundColor = UIColor(displayP3Red: 38/255, green: 38/255, blue: 38/255, alpha: 1)

        tableView.tableFooterView = UIView()

        ...

        navigationController?.isToolbarHidden = false

        let monthlyLabel: NSNumber = 9.99
        let annuallyLabel: NSNumber = 119.88

        let numberFormatter = NumberFormatter()

        numberFormatter.numberStyle = .currency

        fixedMonthlyExpenses.text = numberFormatter.string(from: monthlyLabel)
        fixedAnnuallyExpenses.text = numberFormatter.string(from: annuallyLabel)

        setupToolbarLayout()

    } // viewDidLoad

    ...

    func setupToolbarLayout() {

        guard let toolbar = navigationController?.toolbar else {

            return

        } // guard

        toolbar.addSubview(monthlyLabel)

        monthlyLabel.leadingAnchor.constraint(equalTo: toolbar.leadingAnchor, constant: 5).isActive = true
        monthlyLabel.centerYAnchor.constraint(equalTo: toolbar.centerYAnchor).isActive = true

        toolbar.addSubview(fixedMonthlyExpenses)

        fixedMonthlyExpenses.leadingAnchor.constraint(equalTo: monthlyLabel.trailingAnchor, constant: 5).isActive = true
        fixedMonthlyExpenses.centerYAnchor.constraint(equalTo: toolbar.centerYAnchor).isActive = true

        toolbar.addSubview(fixedAnnuallyExpenses)

        fixedAnnuallyExpenses.trailingAnchor.constraint(equalTo: toolbar.trailingAnchor, constant: -5).isActive = true
        fixedAnnuallyExpenses.centerYAnchor.constraint(equalTo: toolbar.centerYAnchor).isActive = true

        toolbar.addSubview(annuallyLabel)

        annuallyLabel.trailingAnchor.constraint(equalTo: fixedAnnuallyExpenses.leadingAnchor, constant: -5).isActive = true
        annuallyLabel.centerYAnchor.constraint(equalTo: toolbar.centerYAnchor).isActive = true

    } // setupToolbarLayout

...

} // MyTableViewController

......应用程序看起来像:

Shows an UIToolbar with some UILabel as subviews

正如您所看到的,所有这些都发生在setupToolbarLayout()函数中。

......所以,是的,它有效! ...我们可以将子视图添加到集成在UINavigationController中的内置工具栏引用中。