我正在尝试在我的新应用程序上实现iOS 11本机大导航栏标题.通过在viewDidLoad()中调用以下函数:
navigationController?.navigationBar.prefersLargeTitles = true navigationController?.navigationItem.largeTitleDisplayMode = .always
但是,当我开始向上滚动时(主视图中的唯一视图是滚动视图),滚动使大标题以比手指实际滚动更快的速度消失.(也就是说,如果我在屏幕上移动2厘米,滚动视图实际滚动超过2厘米,直到大标题收缩到'通常'大小.)
下面是滚动我的应用程序的GIF.我实际上移动很少,它会自动滚动那么多.这与Apple制造的应用程序(例如,应用程序商店,如我的应用程序下方所示)不同.
有没有人有解决这种异常行为的解决方案?
编辑:每个请求,我添加当前的视图层次结构.我的代码中没有任何特殊内容,我只需设置标题和标记即可prefersLargeTitles.
我正在其中一个应用程序中的导航栏中添加大标题.问题是标题有点长,所以我需要在大标题中添加两行.如何在导航栏中添加两行大标题?
这不是关于默认导航栏标题!这是关于iOS 11中引入的大标题.因此,请务必考虑大型标题来添加建议.谢谢
我附加UISearchController到navigationItem.searchControlleriOS上13这个工作得很好:我可以用最好的iOS的13式搜索栏。
但是,我希望默认情况下看到大标题和搜索栏。
我设置navigationItem.hidesSearchBarWhenScrolling = false是因为我想在我的屏幕上永久看到搜索,但默认情况下搜索栏会替换大标题。
有谁知道这怎么可能?
navigationItem.searchController = UISearchController(searchResultsController: nil)
navigationItem.hidesSearchBarWhenScrolling = false
Run Code Online (Sandbox Code Playgroud)
我有带有视图控制器的标签栏控制器,其中只有一个表视图.
我使用代码设置导航栏大标题:
if (@available(iOS 11.0, *)) {
[[UINavigationBar appearance] setPrefersLargeTitles:YES];
} else {
// Fallback on earlier versions
}
Run Code Online (Sandbox Code Playgroud)
当我第二次打开标签时,它正在崩溃应用程序.或随机移动标签以及以下消息.
错误消息如下所示:
Assertion failure in -[UITableView _addScrollViewScrollObserver:], /BuildRoot/Library/Caches/com.apple.xbs/Sources/UIKit/UIKit-3694.4.18/UIScrollView.m:7693
Run Code Online (Sandbox Code Playgroud)
任何解决问题的想法.谢谢.
uitabbarcontroller uitableview uiappearance ios11 large-title
我有一个视图控制器,我需要在导航栏上显示多行标题。为此,我写了一个这样的协议 -
import UIKit
protocol CustomNavigationBar {
func setupNavigationMultilineTitle(titleText: String, prefersLargeTitles: Bool, largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode)
}
Run Code Online (Sandbox Code Playgroud)
然后扩展它——
extension CustomNavigationBar where Self : UIViewController {
func setupNavigationMultilineTitle(titleText: String, prefersLargeTitles: Bool = true, largeTitleDisplayMode: UINavigationItem.LargeTitleDisplayMode = .automatic ) {
self.navigationController?.navigationBar.prefersLargeTitles = prefersLargeTitles
self.navigationController?.navigationItem.largeTitleDisplayMode = largeTitleDisplayMode
self.navigationController?.navigationBar.largeTitleTextAttributes = [
NSAttributedString.Key.foregroundColor: UIColor.black,
NSAttributedString.Key.font: UIFont.systemFont(ofSize: 18, weight: .semibold)
]
self.title = titleText
if let navBarSubViews = self.navigationController?.navigationBar.subviews {
for navItem in navBarSubViews {
for itemSubView in navItem.subviews {
if let largeLabel = itemSubView as? UILabel { …Run Code Online (Sandbox Code Playgroud) 我想知道是否有任何方法可以更改 iOS 大标题左边距属性。我试图在网上找到它的答案,但我没有成功。
额外问题:项目和屏幕水平边之间的默认边距是 15 吗?我问这个的原因是因为我试图将大标题与我的应用程序的其余元素对齐,屏幕左/右边缘有 15 个。
谢谢 :)
我知道如何设置颜色并更改iOS 11中大标题的字体,但我很难找到大标题的默认字体和字体大小.我想在应用程序的其他地方重现该字体.我尝试了以下但是它们没有给出字体或字体大小的结果.不确定我应该在哪里寻找这个.
NSLog(@"self.navigationController.navigationBar.largeTitleTextAttributes:%@",self.navigationController.navigationBar.largeTitleTextAttributes);
NSDictionary *dict = self.navigationController.navigationBar.largeTitleTextAttributes;
UIFont *font = [dict objectForKey:@"NSFontAttributeName"];
NSLog(@"font is.. %@, %@, %@",font,font.fontName,font.fontDescriptor);
Run Code Online (Sandbox Code Playgroud) 当使用大标题和攻丝状态栏滚动到顶部UIScrollView或UITableView(也可能UICollectionView,没有测试),它总是过得有点过分.
我已启用刷新功能TableView,当点击状态栏时,它会显示为这样,并保持这种状态直到我点击屏幕.
我有一个ScrollView在另一个ViewController,如果我点击状态栏那里它也滚动了一点点太远,使导航栏太高.当我点击某处或滚动一点点时,这也会恢复正常.
这也只有在我激活了大型标题时才会发生,使用普通标题一切正常.
任何想法如何解决这一问题?
如何重新创建:
UIViewController有TableView内.UIViewControllerTableView以固定到边缘ViewControllerTableView在ViewControllertableView滚动到顶部现在标题不在它应该的位置,如果你现在向上或向下滚动一点点,它会快速回到正常位置.
ViewController 码:
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
}
extension ViewController: UITableViewDelegate, UITableViewDataSource {
func numberOfSections(in tableView: UITableView) -> Int { …Run Code Online (Sandbox Code Playgroud) 当使用一个prefersLargeTitles UINavigationController的UINavigationBar中iOS 11,导航栏增加高度.在我检查过的iPhone上增加了44到96,但我认为这些数字可以在每个设备上更改(或者至少我们需要编码,就好像它们可以).
我想以编程方式找到"额外"高度 - 在UINavigationBar显示大标题时添加到传统下方的大标题区域的高度.我可以很容易地找到显示大标题的栏的整个高度,但有没有办法以编程方式单独找到栏的大标题部分的高度(没有任何硬编码)?
我需要这个的原因是有时候我想以编程方式滚动到UITableView的顶部,拉下大标题(在"常规高度"导航栏下滚动)以便它显示,并且我需要的内容偏移是导航栏的额外高度.我可以使用导航栏的总高度,但这会将UITableView拉得太远.要做到这一点,我需要硬编码如下:
[self.tableView setContentOffset:CGPointMake(0, -52) animated:NO];
Run Code Online (Sandbox Code Playgroud) uinavigationbar uinavigationcontroller ios ios11 large-title
感谢您抽出时间阅读。
首先,让我说,我已经尝试尽职尽责地寻找问题的解决方案,但无济于事,这让我感到压力山大!所以,如果有人找到答案,请你指点我的方向:)
我面临的问题与导航栏下方出现的黑线有关。现在,我非常清楚设置导航栏的默认图像/阴影图像属性来纠正这个问题,因此,我创建了自己的扩展来实现它(如下所示)
func hideHairline(_ state:Bool) {
if state {
self.shadowImage = UIImage()
self.setBackgroundImage(UIImage(), for: .any, barMetrics: .default)
}else{
self.setBackgroundImage(UINavigationBar.appearance().backgroundImage(for: UIBarMetrics.default), for:UIBarMetrics.default)
self.shadowImage = nil
}
}
Run Code Online (Sandbox Code Playgroud)
但是,似乎有些行为不正常,并且我的导航栏下方出现了一条黑线(见下文)
更奇怪的是,模拟器并没有在同一个屏幕上显示这条线。模拟器设置为像素精确。(如下所示)
我认为这可能与我从以前的 VC 改变的方式有关。我正在从隐藏导航栏变为显示导航栏,并将其设置为prefersLargeTitles. 现在,如果我设置导航栏,不使用大标题,则不会显示黑线。另外,如果我推到下一个视图控制器,然后弹回来,这条线不存在(在推的控制器上,或者新出现的弹出)
在这一点上,我主要只是想知道为什么会发生这种情况?我的意思是,我一定是做错了什么。我写了一个安装扩展,只是为了让代码远离 VC,可能不是最好的编码实践,但是嘿!
self.hideHairline(true)
self.titleTextAttributes = [NSAttributedStringKey.foregroundColor : Constants.navigationBarTextColor]
self.largeTitleTextAttributes = self.titleTextAttributes
self.barTintColor = Constants.navigationBar
self.tintColor = Constants.navigationBarTint
self.isTranslucent = false
self.backgroundColor = Constants.navigationBar
self.prefersLargeTitles = true
Run Code Online (Sandbox Code Playgroud)
这Constants是一个包含我的应用程序中所有静态变量的类,例如 colo(u)rs。我刚刚犯了一些愚蠢的错误,还是大标题有错误?
如果您需要任何进一步的信息,请询问:)
谢谢
large-title ×11
ios ×8
ios11 ×5
swift ×5
ios13 ×2
fonts ×1
statusbar ×1
uiappearance ×1
uilabel ×1
uitableview ×1
xcode ×1