iOS 11:大标题UINavigationBar的高度(模仿Apple Music App)
iOS 11: Height of UINavigationBar for large title (mimic Apple Music App)
我正在尝试模仿 Apple Music App 使用的 UINavigationBar
外观(日期显示在大标题上方)。
我知道 Apple Music App 不使用 ios11 的标准 UINavigationBar
但 header 视图是 UICollectionView
.
我也想使用 ios11 的标准 UINavigationBar
因为标题文本的大小调整功能。
我可以添加 custom date label
来查看大 title view
的层次结构,我的代码如下所示:
self.title = "Large Title"
navigationController?.navigationBar.prefersLargeTitles = true
guard let navigationBar = navigationController?.navigationBar else { return }
// Create label
let label = UILabel()
label.text = "Small Title"
// Add label to subview hierarchy
for subview in navigationBar.subviews {
let stringFromClass = NSStringFromClass(subview.classForCoder)
if stringFromClass.contains("UINavigationBarLargeTitleView") {
subview.addSubview(label)
}
}
// Add label constraints
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.leftAnchor.constraint(equalTo: navigationBar.leftAnchor, constant: 16.0),
label.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: -50.0),
label.heightAnchor.constraint(equalToConstant: 20.0),
label.widthAnchor.constraint(equalToConstant: 200.0)
])
custom date label
放置正确,但我无法将 UINavigationBar
的高度设置为标签的附加 height
。
由于 ios11 UINavigationBar
使用 Auto-layout,因此设置框架将不再像以前的 iOS 版本那样工作。
系统添加的Auto-layout约束。默认情况下,它的优先级为 1000,因此向标签添加额外的约束不会产生任何效果或导致 Auto-layout 冲突。
有什么提示可以在不滚动的情况下显示 "Large Title" 上方的 "Small Title" 吗?
你可以玩一下 UINavigationBarLargeTitleView
里面的 UILabel
,比如改变它的 Insets 和减小字体大小,这里是一个例子:
// Create label
labelSubtitle.text = "Small Title"
labelSubtitle.backgroundColor = UIColor.clear
labelSubtitle.textColor = UIColor.searchBarTextColor(dark: theme)
labelSubtitle.font = UIFont.systemFont(ofSize: 14)
// Add label to subview hierarchy
for subview in self.navigationController!.navigationBar.subviews {
let stringFromClass = NSStringFromClass(subview.classForCoder)
if stringFromClass.contains("UINavigationBarLargeTitleView") {
let largeSubViews = subview.subviews
for sbv in largeSubViews
{
if let lbl = sbv as? UILabel
{
lbl.padding = UIEdgeInsets(top: 4, left: 0, bottom: 0, right: 0)
lbl.setNeedsLayout()
}
}
subview.addSubview(labelSubtitle)
}
}
self.navigationController!.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 30, weight: .bold)]
labelSubtitle.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
labelSubtitle.leftAnchor.constraint(equalTo: self.navigationController!.navigationBar.leftAnchor, constant: 20.0),
labelSubtitle.bottomAnchor.constraint(equalTo: self.navigationController!.navigationBar.bottomAnchor, constant: -37.0),
labelSubtitle.heightAnchor.constraint(equalToConstant: 20.0),
labelSubtitle.widthAnchor.constraint(equalToConstant: 200.0)
])
要更改插图,我正在使用在此 post 中发布的扩展:Adding space/padding to a UILabel
结果如下:
我正在尝试模仿 Apple Music App 使用的 UINavigationBar
外观(日期显示在大标题上方)。
我知道 Apple Music App 不使用 ios11 的标准 UINavigationBar
但 header 视图是 UICollectionView
.
我也想使用 ios11 的标准 UINavigationBar
因为标题文本的大小调整功能。
我可以添加 custom date label
来查看大 title view
的层次结构,我的代码如下所示:
self.title = "Large Title"
navigationController?.navigationBar.prefersLargeTitles = true
guard let navigationBar = navigationController?.navigationBar else { return }
// Create label
let label = UILabel()
label.text = "Small Title"
// Add label to subview hierarchy
for subview in navigationBar.subviews {
let stringFromClass = NSStringFromClass(subview.classForCoder)
if stringFromClass.contains("UINavigationBarLargeTitleView") {
subview.addSubview(label)
}
}
// Add label constraints
label.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
label.leftAnchor.constraint(equalTo: navigationBar.leftAnchor, constant: 16.0),
label.bottomAnchor.constraint(equalTo: navigationBar.bottomAnchor, constant: -50.0),
label.heightAnchor.constraint(equalToConstant: 20.0),
label.widthAnchor.constraint(equalToConstant: 200.0)
])
custom date label
放置正确,但我无法将 UINavigationBar
的高度设置为标签的附加 height
。
由于 ios11 UINavigationBar
使用 Auto-layout,因此设置框架将不再像以前的 iOS 版本那样工作。
系统添加的Auto-layout约束。默认情况下,它的优先级为 1000,因此向标签添加额外的约束不会产生任何效果或导致 Auto-layout 冲突。
有什么提示可以在不滚动的情况下显示 "Large Title" 上方的 "Small Title" 吗?
你可以玩一下 UINavigationBarLargeTitleView
里面的 UILabel
,比如改变它的 Insets 和减小字体大小,这里是一个例子:
// Create label
labelSubtitle.text = "Small Title"
labelSubtitle.backgroundColor = UIColor.clear
labelSubtitle.textColor = UIColor.searchBarTextColor(dark: theme)
labelSubtitle.font = UIFont.systemFont(ofSize: 14)
// Add label to subview hierarchy
for subview in self.navigationController!.navigationBar.subviews {
let stringFromClass = NSStringFromClass(subview.classForCoder)
if stringFromClass.contains("UINavigationBarLargeTitleView") {
let largeSubViews = subview.subviews
for sbv in largeSubViews
{
if let lbl = sbv as? UILabel
{
lbl.padding = UIEdgeInsets(top: 4, left: 0, bottom: 0, right: 0)
lbl.setNeedsLayout()
}
}
subview.addSubview(labelSubtitle)
}
}
self.navigationController!.navigationBar.largeTitleTextAttributes = [NSAttributedStringKey.font: UIFont.systemFont(ofSize: 30, weight: .bold)]
labelSubtitle.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
labelSubtitle.leftAnchor.constraint(equalTo: self.navigationController!.navigationBar.leftAnchor, constant: 20.0),
labelSubtitle.bottomAnchor.constraint(equalTo: self.navigationController!.navigationBar.bottomAnchor, constant: -37.0),
labelSubtitle.heightAnchor.constraint(equalToConstant: 20.0),
labelSubtitle.widthAnchor.constraint(equalToConstant: 200.0)
])
要更改插图,我正在使用在此 post 中发布的扩展:Adding space/padding to a UILabel
结果如下: