【问题标题】:Custom View in Navigationbar titleView disappear iOS SwiftNavigationbar titleView中的自定义视图消失iOS Swift
【发布时间】:2020-10-29 04:07:01
【问题描述】:

iOS 导航栏中的 titleView 出现问题。我为titleView创建了一个自定义视图,但是每次我推送另一个控制器时,当我回到第一个视图控制器时,titleView会立即出现和消失。这是我的代码。

 override func viewDidLoad() {
            super.viewDidLoad()
    let logo = UIImage(named: "img_appbar_logo")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
                logoContainer = UIView(frame: CGRect(x: 0, y: 0, width: 180, height: 40))
                logoContainer.backgroundColor = UIColor.clear
    
                animatedLogo = UIImageView(frame:  CGRect(x: 0, y: 0, width: logoContainer.frame.width, height: logoContainer.frame.height))
                animatedLogo.contentMode = .scaleAspectFit
                animatedLogo.clipsToBounds = true
                animatedLogo.image = logo
                
                logoContainer.addSubview(animatedLogo)
       
                navigationItem.titleView = logoContainer
    }

【问题讨论】:

  • 您是否检查了您正在推送的新控制器的导航项?我的意思是,如果新控制器不应该有,请尝试将其设置为 nil 或将项目的背景颜色设置为清除。新控制器的这个导航项是否已经出现?
  • 是的,实际上,我也尝试在 viewDidLoad 甚至 viewWillAppear 上的新控制器上应用徽标,不幸的是,错误仍然存​​在。
  • 我建议覆盖navigationItem属性,见developer.apple.com/documentation/uikit/uiviewcontroller/…
  • 你能分享一个屏幕截图或一个 gif 格式的视觉资料,以便更好地理解这个问题@vidalbenjoe

标签: ios swift iphone uinavigationbar


【解决方案1】:

我已经修复了导航栏中与 titleView 相关的问题。我发现在我推另一个控制器并弹回来后,titleView 将被 NavigationItem 中的空 UILabel 视图替换。这就是titleView出现然后消失的原因。

我是如何解决这个问题的?

我将自定义视图直接添加到导航栏。这是代码

 let logo = UIImage(named: "img_appbar_logo")?.withRenderingMode(UIImageRenderingMode.alwaysTemplate)
                        logoContainer = UIView(frame: CGRect(x: 0, y: 0, width: 180, height: 40))
    
                        logoContainer.backgroundColor = UIColor.red
        
                        animatedLogo = UIImageView(frame:  CGRect(x: 0, y: logoContainer.frame.origin.y, width: logoContainer.frame.width, height: logoContainer.frame.height))
                        animatedLogo.contentMode = .scaleAspectFit
                        animatedLogo.clipsToBounds = true
                        animatedLogo.image = logo
                
                        logoContainer.addSubview(animatedLogo)
                
                
                navigationController?.navigationBar.addSubview(logoContainer) <--- new
//navigationItem.titleView = logoContainer <---- old

然后移除 viewWillDisappear 上的视图

override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)
        logoContainer.removeFromSuperview()
    }

【讨论】:

    【解决方案2】:

    在 viewWillAppear 中设置 titleView,因为 titleView 被前一个控制器中的标题替换

    【讨论】:

    • 我也已经尝试过这种方法。但同样的问题仍然存在。
    猜你喜欢
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-14
    相关资源
    最近更新 更多