视图控制器的标题不合适

时间:2018-10-26 17:22:38

标签: ios swift

因此,我继承的应用的原始设置具有如下所示的导航栏设置(这在我的AppDelegate中):

private func configureNavigationController(_ navigationController: UINavigationController) {
    navigationController.navigationBar.isTranslucent = false

    self.window?.rootViewController = navigationController

    let imageView = UIImageView(image: UIImage(named: "logo-white"))
    imageView.contentMode = UIViewContentMode.scaleAspectFit

    let center = (navigationController.topViewController?.view.frame.width)! / 2.0 - 44

    let titleView = UIView(frame: CGRect(x: center, y: 0, width: 88, height: 44))
    imageView.frame = titleView.bounds
    titleView.addSubview(imageView)


    UINavigationBar.appearance().barTintColor = UIColor.navBackground
    UINavigationBar.appearance().tintColor = UIColor.white
    UINavigationBar.appearance().addSubview(titleView)
}

这将正确地在每个视图控制器上创建导航栏,图像居中,但是我有一些新功能需要放在所有内容的顶部,并且此徽标文件-logo-white-仍显示在顶部

那是我要解决的真正问题-因此,如果下面尝试的解决方案是错误的,请告诉我并告诉我正确的方法。

无论如何,我尝试在AppDelegate中注释掉上面的代码,并将其放入我需要的特定视图控制器中

override func viewDidLoad() {
    super.viewDidLoad()

    let imageView = UIImageView(image: UIImage(named: "logo-white"))
    imageView.contentMode = UIViewContentMode.scaleAspectFit

    let center = (navigationController!.topViewController?.view.frame.width)!// / 2.0 - 44

    let titleView = UIView(frame: CGRect(x: center, y: 0, width: 88, height: 44))

    imageView.frame = titleView.bounds
    titleView.addSubview(imageView)

    navigationItem.titleView = imageView

但是这不起作用-我可以将徽标显示在屏幕左侧,或者稍微偏离中心,但永远不要居中。

我猜这是因为该栏的两侧都有一个后退按钮和一个小设置图标。

那么,如何正确执行此操作?

有没有办法使徽标覆盖住?是将其移入我的各个视图控制器的解决方案吗?

这里是重叠的图片。徽标“ Pinyada”根本不应掩盖所有内容-这是应该放在所有内容之上的第三方库。

Logo on top of the third party library that is covering everything else

When I try to put the header setup in the viewcontroller, the image is unbalanced

2 个答案:

答案 0 :(得分:1)

您可以尝试以下方法:

<link rel="stylesheet" property="stylesheet" href="/foo/static/css/bar-c0b40.css" type="text/css">

如果您有override func viewDidLoad() { super.viewDidLoad() let imageView = UIImageView(image: UIImage(named: "logo-white")) imageView.contentMode = .scaleAspectFit imageView.frame = CGRect(x: 0, y: 0, width: 88, height: 44) navigationItem.titleView = imageView } ,则无需其他标题视图。

有时,如果您需要对titleView进行更精确的控制,则可以添加customTitleView。在viewController中添加以下代码,即可获得所需的内容。

navigationItem.titleView

顺便说一句,let imageView = UIImageView(image: UIImage(named: "logo-white")) private func addTitleView(){ let nbar = (navigationController?.navigationBar)! let width = nbar.frame.width imageView.contentMode = UIView.ContentMode.scaleAspectFit imageView.frame = CGRect.init(x: (width - 88) / 2.0 , y: 0, width: 88, height: 44) nbar.addSubview(imageView) } private func removeTitleView(){ imageView.removeFromSuperview() } override func viewWillAppear(_ animated: Bool) { super.viewWillAppear(animated) addTitleView() } override func viewWillDisappear(_ animated: Bool) { super.viewWillDisappear(animated) removeTitleView() }

此方法将导致所有NavigationBar具有相同的titleView,这不是您想要的。

答案 1 :(得分:0)

我知道了。

对标头的其他修改之一是占用了太多空间。我把它缩小了,图像非常适合。

我将所有生成标头的代码从AppDelegate中移出,并移到了导航协议中,然后将其弹出到每个ViewController中。