iOS 11 - Navigationbar 大标题自定义偏移量
iOS 11 - Navigationbar large title custom offset
是否可以更改大导航栏标题的x-offset?我想将 x-offset 更改为 36pt。
你不能。您需要编写自己的 NavigationController,为此将 UINavigationController 子类化。
您可以通过这种方式添加额外的偏移量:
if #available(iOS 11.0, *) {
let navigationBarAppearance = UINavigationBar.appearance()
let style = NSMutableParagraphStyle()
style.alignment = .justified
style.firstLineHeadIndent = 18
navigationBarAppearance.largeTitleTextAttributes = [NSAttributedStringKey.paragraphStyle: style]
}
您必须子类化 UINavigationBar,然后覆盖 draw 方法,并在内部进行更改。看看我的工作示例,然后根据需要调整 offset/styles:
override func draw(_ rect: CGRect) {
super.draw(rect)
self.backgroundColor = UIColor.white
let largeView = "_UINavigationBarLargeTitleView"
let labelcolor = UIColor(red: 36.0/255.0, green: 38.0/255.0, blue: 47.0/255.0, alpha: 1.0)
for view in self.subviews {
if largeView.contains(String(describing: type(of: view))) {
for v in view.subviews {
if String(describing: type(of: v)) == "UILabel" {
var titleLabel = v as! UILabel
var labelRect = titleLabel.frame
let labelInsets = UIEdgeInsets(top: 10, left: 13, bottom: 0, right: 0)
let attrText = NSMutableAttributedString(string: "Jobs", attributes: [NSAttributedStringKey.font: UIFont(name: "SFProDisplay-Heavy", size: 30)!, NSAttributedStringKey.foregroundColor: labelcolor])
labelRect.origin.y += 20
let newLabel = UILabel(frame: labelRect)
newLabel.attributedText = attrText
titleLabel.text = ""
if labelRect.origin.y > 0 {
titleLabel = newLabel
titleLabel.drawText(in: UIEdgeInsetsInsetRect(labelRect, labelInsets))
}
}
}
}
}
}
刚刚发现在最新的iOS12版本中,如果单纯修改UINavigationBar
的layoutMargins
属性,这样会影响大标题。
let navigationBar = navigationController.navigationBar
navigationBar.layoutMargins.left = 36
navigationBar.layoutMargins.right = 36
我尝试了这里提到的关于使用自定义 NSMutableParagraphStyle
的解决方案。这确实有效,但是因为它拉伸了构成大标题的 UILabel
视图,当您向下滑动时,它在文本略微增长的地方播放的微妙动画变得非常扭曲。
是否可以更改大导航栏标题的x-offset?我想将 x-offset 更改为 36pt。
你不能。您需要编写自己的 NavigationController,为此将 UINavigationController 子类化。
您可以通过这种方式添加额外的偏移量:
if #available(iOS 11.0, *) {
let navigationBarAppearance = UINavigationBar.appearance()
let style = NSMutableParagraphStyle()
style.alignment = .justified
style.firstLineHeadIndent = 18
navigationBarAppearance.largeTitleTextAttributes = [NSAttributedStringKey.paragraphStyle: style]
}
您必须子类化 UINavigationBar,然后覆盖 draw 方法,并在内部进行更改。看看我的工作示例,然后根据需要调整 offset/styles:
override func draw(_ rect: CGRect) {
super.draw(rect)
self.backgroundColor = UIColor.white
let largeView = "_UINavigationBarLargeTitleView"
let labelcolor = UIColor(red: 36.0/255.0, green: 38.0/255.0, blue: 47.0/255.0, alpha: 1.0)
for view in self.subviews {
if largeView.contains(String(describing: type(of: view))) {
for v in view.subviews {
if String(describing: type(of: v)) == "UILabel" {
var titleLabel = v as! UILabel
var labelRect = titleLabel.frame
let labelInsets = UIEdgeInsets(top: 10, left: 13, bottom: 0, right: 0)
let attrText = NSMutableAttributedString(string: "Jobs", attributes: [NSAttributedStringKey.font: UIFont(name: "SFProDisplay-Heavy", size: 30)!, NSAttributedStringKey.foregroundColor: labelcolor])
labelRect.origin.y += 20
let newLabel = UILabel(frame: labelRect)
newLabel.attributedText = attrText
titleLabel.text = ""
if labelRect.origin.y > 0 {
titleLabel = newLabel
titleLabel.drawText(in: UIEdgeInsetsInsetRect(labelRect, labelInsets))
}
}
}
}
}
}
刚刚发现在最新的iOS12版本中,如果单纯修改UINavigationBar
的layoutMargins
属性,这样会影响大标题。
let navigationBar = navigationController.navigationBar
navigationBar.layoutMargins.left = 36
navigationBar.layoutMargins.right = 36
我尝试了这里提到的关于使用自定义 NSMutableParagraphStyle
的解决方案。这确实有效,但是因为它拉伸了构成大标题的 UILabel
视图,当您向下滑动时,它在文本略微增长的地方播放的微妙动画变得非常扭曲。