首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UINavigationItem TitleView消失了

UINavigationItem TitleView消失了
EN

Stack Overflow用户
提问于 2015-11-23 08:19:30
回答 3查看 2.9K关注 0票数 4

我正在尝试为导航栏创建自定义titleView。我可以在嵌入在导航控制器中的根视图控制器中设置titleView。

当我将第二个视图控制器推送到堆栈上并尝试为此视图控制器设置titleView时,它不起作用。titleView会迅速出现和消失。当我返回到上一个视图控制器时,这个titleView也很快出现和消失了。

有谁知道为什么会发生这种情况,或者如何正确设置titleView而不闪烁和消失?

代码语言:javascript
复制
class FirstViewController: UIViewController {

    var titleView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        addTitleView()
    }

    func addTitleView() {
        titleView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 44))

        let companyLabel = UILabel(frame: CGRect(x: 0, y: 3, width: 150, height: 11))
        companyLabel.text = "CPS Dashboard"
        companyLabel.textColor = UIColor.grayColor()
        companyLabel.textAlignment = .Center
        companyLabel.font = UIFont.systemFontOfSize(9)
        titleView.addSubview(companyLabel)

        let titleLabel = UILabel(frame: CGRect(x: 0, y: 16, width: 150, height: 18))
        titleLabel.text = "Dashboard"
        titleLabel.textColor = UIColor.blackColor()
        titleLabel.textAlignment = .Center
        titleLabel.font = UIFont.systemFontOfSize(15)
        titleView.addSubview(titleLabel)

        navigationItem.titleView = titleView
    }

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
        if segue.identifier == "Show" {
            let controller = segue.destinationViewController as! SecondViewController
            controller.titleView = titleView
        }
    }
}

第二个视图控制器:

代码语言:javascript
复制
class SecondViewController: UIViewController {

    var titleView: UIView?

    override func viewDidLoad() {
        super.viewDidLoad()

        if let titleView = titleView {
            navigationItem.titleView = titleView
        }
    }
}
EN

回答 3

Stack Overflow用户

发布于 2015-11-23 23:43:46

我找到了一个解决方案。我将addTitleView()方法从FirstViewController复制到SecondViewController中,并在viewDidLoad()中调用这两个方法。这就是我想要的效果。由于某些原因,将titleView作为属性向前传递并将其分配给navigationItem.titleView是行不通的。

代码语言:javascript
复制
class FirstViewController: UIViewController {

    var titleView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        addTitleView()
    }

    func addTitleView() {
        titleView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 44))

        let companyLabel = UILabel(frame: CGRect(x: 0, y: 3, width: 150, height: 11))
        companyLabel.text = "CPS Dashboard"
        companyLabel.textColor = UIColor.grayColor()
        companyLabel.textAlignment = .Center
        companyLabel.font = UIFont.systemFontOfSize(9)
        titleView.addSubview(companyLabel)

        let titleLabel = UILabel(frame: CGRect(x: 0, y: 16, width: 150, height: 18))
        titleLabel.text = "Dashboard"
        titleLabel.textColor = UIColor.blackColor()
        titleLabel.textAlignment = .Center
        titleLabel.font = UIFont.systemFontOfSize(15)
        titleView.addSubview(titleLabel)

        navigationItem.titleView = titleView
    }
}

第二个视图控制器:

代码语言:javascript
复制
class SecondViewController: UIViewController {

    var titleView: UIView!

    override func viewDidLoad() {
        super.viewDidLoad()
        addTitleView()
    }

    func addTitleView() {
        titleView = UIView(frame: CGRect(x: 0, y: 0, width: 150, height: 44))

        let companyLabel = UILabel(frame: CGRect(x: 0, y: 3, width: 150, height: 11))
        companyLabel.text = "CPS Dashboard"
        companyLabel.textColor = UIColor.grayColor()
        companyLabel.textAlignment = .Center
        companyLabel.font = UIFont.systemFontOfSize(9)
        titleView.addSubview(companyLabel)

        let titleLabel = UILabel(frame: CGRect(x: 0, y: 16, width: 150, height: 18))
        titleLabel.text = "Dashboard"
        titleLabel.textColor = UIColor.blackColor()
        titleLabel.textAlignment = .Center
        titleLabel.font = UIFont.systemFontOfSize(15)
        titleView.addSubview(titleLabel)

        navigationItem.titleView = titleView
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-07-15 22:15:55

我的解决方案很简单,而且很管用:

代码语言:javascript
复制
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    if let tv = navigationItem.titleView {
        print("transform", tv.transform)) // is always identity
        let bounds = tv.bounds
        print("bounds", bounds) // its origin may not be zero.
        tv.bounds = CGRect(origin: .zero, size: bounds.size)
        print("new bounds", tv.bounds)
    }
}

使用Xcode的视图调试器,您会发现titleView.bounds.origin不是零。

如何让它再次发生,两个步骤: 1. UIViewController A和B;A有自定义的navigationItem.titleView,B将navigationBar隐藏在它的viewWillAppear()中;当B弹出时,A.viewWillAppear() setNavigationBar(隐藏: false,navigationBar:true) 2.举手取消用户驱动的popViewController

然后你会发现,A的navigationBar是空的。

票数 0
EN

Stack Overflow用户

发布于 2019-10-31 01:53:07

我也遇到了同样的问题,但上面的解决方案都没有解决这个问题。我的问题是我将translatesAutoresizingMaskIntoConstraints设置为false。我认为这会导致出现/消失,因为需要将其设置为true,以便在内部将视图约束到导航栏。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33861952

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档