导航栏大标题转小标题不流畅iOS 13、卡顿
Large title to small title switch in navigation bar is not smooth iOS 13, sticky
我有一个 UINavigationController
,默认值为 navigationBar.prefersLargeTitles = true
。
当我 push
进入一个新场景时,我将其切换为 false
让我们通过将其更改为 viewWillDisappear
来调用它 (DetailsViewController
)。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}
现在 DetailsViewController
我正在使用 willMove(to parent:)
。
override func willMove(toParent parent: UIViewController?) {
navigationController?.navigationBar.prefersLargeTitles = true
}
转换回大标题。
观察随附的快照,了解 iOS 13 和 iOS 12 的做法,考虑到 iOS 12 是正确的行为。
iOS 13 :
iOS 12 :
你所做的总是错的。您应该将导航栏的 prefersLargeTitles
设置为 true
一次,并且永远不要再触摸它。
更改每个视图控制器对大标题所做的事情的方法是,视图控制器设置自己的 navigationItem
(在其 viewDidLoad
中)以获得所需的 largeTitleDisplayMode
.所以如果第一个v.c。有 .always
第二个有 .never
一切都会很顺利。
我遇到了同样的问题,不得不在第二个 ViewController 的故事板上放置一个 NavigationItem。我的 NavigationItem 是由 segue 自动创建的,它在 viewDidLoad()
中的 prefersLargeTitle
在视图出现之前尚未完成创建。向故事板添加 NavigationItem 解决了这个问题,并允许我在故事板的属性菜单中设置 prefersLargeTitle
。
在我的例子中,这个问题发生在与 UITabBarController
的子视图控制器的连接期间。在子视图控制器上设置 largeTitleDisplayMode
不足以修复此错误。
我已经通过向 UITabBarController 场景添加导航项并将 largeTitleDisplayMode
设置为 .never
解决了这个问题。
我是这样解决这个问题的:
override func viewWillDisappear(_ animated: Bool) {
title = ""
}
一切巧妙很简单))
final class CustomHosting<Content: View>: UIHostingController<Content> {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.largeTitleDisplayMode = .never
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationItem.largeTitleDisplayMode = .automatic
}
}
我解决了同样的问题 :) 我的问题是从 UIKit Collection 显示 SUI 详细信息 Collection 视图,并且在导航标题更改时有一些跳跃。
Swift5,Xcode13:
UIViewController(1) + UINavigationController:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "Your title here"
}
UIViewController(2 - “即:detailsViewController”):
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .never
navigationItem.title = "Your title here"
}
它很有魅力!
我有一个 UINavigationController
,默认值为 navigationBar.prefersLargeTitles = true
。
当我 push
进入一个新场景时,我将其切换为 false
让我们通过将其更改为 viewWillDisappear
来调用它 (DetailsViewController
)。
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
navigationController?.navigationBar.prefersLargeTitles = false
}
现在 DetailsViewController
我正在使用 willMove(to parent:)
。
override func willMove(toParent parent: UIViewController?) {
navigationController?.navigationBar.prefersLargeTitles = true
}
转换回大标题。
观察随附的快照,了解 iOS 13 和 iOS 12 的做法,考虑到 iOS 12 是正确的行为。
iOS 13 :
iOS 12 :
你所做的总是错的。您应该将导航栏的 prefersLargeTitles
设置为 true
一次,并且永远不要再触摸它。
更改每个视图控制器对大标题所做的事情的方法是,视图控制器设置自己的 navigationItem
(在其 viewDidLoad
中)以获得所需的 largeTitleDisplayMode
.所以如果第一个v.c。有 .always
第二个有 .never
一切都会很顺利。
我遇到了同样的问题,不得不在第二个 ViewController 的故事板上放置一个 NavigationItem。我的 NavigationItem 是由 segue 自动创建的,它在 viewDidLoad()
中的 prefersLargeTitle
在视图出现之前尚未完成创建。向故事板添加 NavigationItem 解决了这个问题,并允许我在故事板的属性菜单中设置 prefersLargeTitle
。
在我的例子中,这个问题发生在与 UITabBarController
的子视图控制器的连接期间。在子视图控制器上设置 largeTitleDisplayMode
不足以修复此错误。
我已经通过向 UITabBarController 场景添加导航项并将 largeTitleDisplayMode
设置为 .never
解决了这个问题。
我是这样解决这个问题的:
override func viewWillDisappear(_ animated: Bool) {
title = ""
}
一切巧妙很简单))
final class CustomHosting<Content: View>: UIHostingController<Content> {
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
self.navigationItem.largeTitleDisplayMode = .never
}
override func viewWillDisappear(_ animated: Bool) {
super.viewWillDisappear(animated)
self.navigationItem.largeTitleDisplayMode = .automatic
}
}
我解决了同样的问题 :) 我的问题是从 UIKit Collection 显示 SUI 详细信息 Collection 视图,并且在导航标题更改时有一些跳跃。
Swift5,Xcode13:
UIViewController(1) + UINavigationController:
override func viewDidLoad() {
super.viewDidLoad()
navigationController?.navigationBar.prefersLargeTitles = true
navigationItem.title = "Your title here"
}
UIViewController(2 - “即:detailsViewController”):
override func viewDidLoad() {
super.viewDidLoad()
navigationItem.largeTitleDisplayMode = .never
navigationItem.title = "Your title here"
}
它很有魅力!