Добавить субтитры под заголовком в контроллере навигационной панели в Xcode
Итак, я хочу добавить "субтитры" под заголовком в панели навигации в навигационном контроллере.
В основном все, на что я смотрю, хочет, чтобы я использовал CGRect. Я не знаю, что это такое, и кажется, что он хочет, чтобы я создал совершенно новое представление, чего я не хочу делать.
Мой вопрос в том, есть ли точечный метод легко добавлять представление субтитров?
Самое близкое, что я нашел, было опубликовано в переполнении стека, и вот ссылка:
Создайте субтитры в панели навигации
По-видимому, в прошлом году это сработало, но теперь я получаю ошибки и его в моем представленииDidLoad...
Я пробовал это:
self.navigationController?.navigationItem.prompt = "Subtitle Here"
Это единственное, что не показывает никаких ошибок, но все равно не работает. Оно буквально ничего не делает. По крайней мере, ничего не видно во время выполнения.
В боковом примечании предпочтительным является быстрый. Спасибо!
Ответы
Ответ 1
Хотя есть решение, но у него есть некоторые известные проблемы
Решение записывает такую функцию, как
func setTitle(title:String, subtitle:String) -> UIView {
let titleLabel = UILabel(frame: CGRectMake(0, -2, 0, 0))
titleLabel.backgroundColor = UIColor.clearColor()
titleLabel.textColor = UIColor.grayColor()
titleLabel.font = UIFont.boldSystemFontOfSize(17)
titleLabel.text = title
titleLabel.sizeToFit()
let subtitleLabel = UILabel(frame: CGRectMake(0, 18, 0, 0))
subtitleLabel.backgroundColor = UIColor.clearColor()
subtitleLabel.textColor = UIColor.blackColor()
subtitleLabel.font = UIFont.systemFontOfSize(12)
subtitleLabel.text = subtitle
subtitleLabel.sizeToFit()
let titleView = UIView(frame: CGRectMake(0, 0, max(titleLabel.frame.size.width, subtitleLabel.frame.size.width), 30))
titleView.addSubview(titleLabel)
titleView.addSubview(subtitleLabel)
let widthDiff = subtitleLabel.frame.size.width - titleLabel.frame.size.width
if widthDiff < 0 {
let newX = widthDiff / 2
subtitleLabel.frame.origin.x = abs(newX)
} else {
let newX = widthDiff / 2
titleLabel.frame.origin.x = newX
}
return titleView
}
Использование этой функции для пользовательского названия заголовка навигации в viewDidLoad
self.navigationItem.titleView = setTitle("Title", subtitle: "SubTitle")
Только известная проблема заключается в том, что если субтитры становятся очень большими, чем происходит смещение.
Итоговый результат
![введите описание изображения здесь]()
Источник: https://gist.github.com/nazywamsiepawel/0166e8a71d74e96c7898
Ответ 2
Вот моя версия, использующая представление стека в расширении.
extension UINavigationItem {
func setTitle(title:String, subtitle:String) {
let one = UILabel()
one.text = title
one.font = UIFont.systemFont(ofSize: 17)
one.sizeToFit()
let two = UILabel()
two.text = subtitle
two.font = UIFont.systemFont(ofSize: 12)
two.textAlignment = .center
two.sizeToFit()
let stackView = UIStackView(arrangedSubviews: [one, two])
stackView.distribution = .equalCentering
stackView.axis = .vertical
let width = max(one.frame.size.width, two.frame.size.width)
stackView.frame = CGRect(x: 0, y: 0, width: width, height: 35)
one.sizeToFit()
two.sizeToFit()
self.titleView = stackView
}
}
Ответ 3
Большое спасибо за ваш ответ! @RajanMaheshwari
Ваше кодирование отлично работало, за исключением инструкции if, сделанной с помощью widthDiff..
Я немного поправил его, и все прошло гладко.
if widthDiff < 0 {
let newX = widthDiff / 2
subtitleLabel.frame.origin.x = abs(newX)
} else {
let newX = widthDiff / 2
titleLabel.frame.origin.x = newX
}
Еще раз спасибо за ваш ответ!
Ответ 4
Спасибо за ответ @RajanMaheshwari
Если у кого-то возникает проблема, когда заголовок становится несогласованным, когда текст субтитров длиннее текста заголовка, я добавил следующий код в ответ Rajan выше, чуть ниже, где создается субтитрLabel:
// Fix incorrect width bug
if (subtitleLabel.frame.size.width > titleLabel.frame.size.width) {
var titleFrame = titleLabel.frame
titleFrame.size.width = subtitleLabel.frame.size.width
titleLabel.frame = titleFrame
titleLabel.textAlignment = .center
}
Надеюсь, это поможет кому-то, кто столкнулся с той же проблемой, что и я.
Ответ 5
Другое решение, использующее только одну метку и NSAttributedString
, чтобы отличать название и субтитры (с разными размерами шрифта, весами, цветами и т.д.). Устраняет проблему разного выравнивания меток.
extension UIViewController {
func setTitle(_ title: String, subtitle: String) {
let rect = CGRect(x: 0, y: 0, width: 400, height: 50)
let titleSize: CGFloat = 20 // adjust as needed
let subtitleSize: CGFloat = 15
let label = UILabel(frame: rect)
label.backgroundColor = .clear
label.numberOfLines = 2
label.textAlignment = .center
label.textColor = .black
let text = NSMutableAttributedString()
text.append(NSAttributedString(string: title, attributes: [.font : UIFont.boldSystemFont(ofSize: titleSize)]))
text.append(NSAttributedString(string: "\n\(subtitle)", attributes: [.font : UIFont.systemFont(ofSize: subtitleSize)]))
label.attributedText = text
self.navigationItem.titleView = label
}
}
Пользовательское titleView частично основано на fooobar.com/info/418554/...