【问题标题】:Base view UI nav bar responsiveness to orientation基本视图 UI 导航栏对方向的响应
【发布时间】:2021-05-25 16:36:39
【问题描述】:

我是使用 Swift 和 Xcode 开发 iOS 应用程序的超级新手。现在,我正在尝试为我的所有视图创建一个带有导航栏的基本视图,而不是使用导航控制器。当我在横向模式下开始时,导航栏看起来不错,但是当我切换到纵向模式时,高度看起来会消失。当我以纵向模式开始时,横向模式会在导航栏只有全长一半的地方看起来不明显。似乎当我更改为横向模式时,没有绘制导航栏并且它使用了旧的......在下面的代码中,我有一个方向监听器再次绘制导航栏,但它似乎不起作用。

import UIKit

class BaseViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()
        NotificationCenter.default.addObserver(self, selector: #selector(BaseViewController.rotated), name: UIDevice.orientationDidChangeNotification, object: nil)
    }

    deinit {
       NotificationCenter.default.removeObserver(self, name: UIDevice.orientationDidChangeNotification, object: nil)
    }

    @objc func rotated() {
        if UIDevice.current.orientation.isLandscape {
            print("Landscape")
            createNavBarLandscape()
        } else {
            print("Portrait")
            createNavBarPortrait()
        }
    }
    
    func createNavBarLandscape() {
        let navBar = UINavigationBar(frame: CGRect(x: 0, y: 50, width: view.frame.size.width * 2, height: 24))
        view.addSubview(navBar)
        
        navBar.barTintColor = .white
        let navItem = UINavigationItem(title: "logo")
        let logo = UIImage(named: "logo.png")
        let imageView = UIImageView(image:logo)
        navItem.titleView = imageView
        navBar.setItems([navItem], animated: false)
    }
    
    func createNavBarPortrait() {
        let navBar = UINavigationBar(frame: CGRect(x: 0, y: 50, width: view.frame.size.width, height: 44))
        view.addSubview(navBar)
        
        navBar.barTintColor = .white
        let navItem = UINavigationItem(title: "logo")
        let logo = UIImage(named: "logo.png")
        let imageView = UIImageView(image:logo)
        navItem.titleView = imageView
        navBar.setItems([navItem], animated: false)
    }
}

以纵向模式开始:
人像模式:

横向模式:

以横向模式开始:
横向模式:

人像模式:

【问题讨论】:

  • 您可以发布图片来声明问题吗?更清楚
  • @Menaim 添加图片
  • 你在用故事板吗??
  • @gofish - 如果您想模拟导航栏,请使用自动布局约束。它的高度会根据垂直特性自动从 44 变为 32。
  • @Menaim 不,我不是。正如我所说,我正在为我的所有控制器创建一个基本视图控制器来继承。

标签: ios swift xcode responsive-design uinavigationbar


【解决方案1】:

试试这个...

class MyBaseViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        
        let navBar = UINavigationBar()
        view.addSubview(navBar)
        
        navBar.barTintColor = .white
        let navItem = UINavigationItem(title: "logo")
        let imageView = UIImageView()
        if let logo = UIImage(named: "logo") {
            imageView.image = logo
        }
        navItem.titleView = imageView
        navBar.setItems([navItem], animated: false)

        navBar.translatesAutoresizingMaskIntoConstraints = false
        
        // respect safe area
        let g = view.safeAreaLayoutGuide
        
        NSLayoutConstraint.activate([
            navBar.topAnchor.constraint(equalTo: g.topAnchor),
            navBar.leadingAnchor.constraint(equalTo: g.leadingAnchor),
            navBar.trailingAnchor.constraint(equalTo: g.trailingAnchor),
        ])
        
    }

}

【讨论】:

  • 导航栏在横向模式下没有完全扩展角落。你可以在这里查看:link。无论如何要解决这个问题?除此之外,它工作得很好!
  • @gofish - 将前导和尾随约束到 view.leadingAnchor / view.trailingAnchor 而不是安全区域指南。
  • 谢谢!!你是一个救生员!
猜你喜欢
  • 1970-01-01
  • 2021-05-11
  • 1970-01-01
  • 2019-10-21
  • 2018-08-12
  • 2018-01-27
  • 1970-01-01
  • 2021-11-20
相关资源
最近更新 更多