ios - 基本视图 UI 导航栏对方向的响应
问题描述
我是使用 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)
}
}
解决方案
试试这个...
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),
])
}
}
推荐阅读
- python - Pandas 将行与具有相似部分多索引的行进行比较
- javascript - ExtJS:全局函数在页面加载之前执行。怎么拖延?
- ios - 适用于 iOS 的 ADAL 是否与 ADFS 3.0 版兼容?
- c++ - 模棱两可的递归模板函数
- html - CSS flex 布局,将元素固定到结尾
- c# - 时间:2019-01-10 标签:c#sqlupdatedatadatagridsetdatagrid
- javascript - for循环中的Javascript Concat问题
- ms-access - 在 MS Access 中创建用户访问矩阵
- java - 无法合并 dex 时出错
- java - Bean 定义被 AutoConfiguration 覆盖