Подтвердить что ты не робот

Добавить субтитры под заголовком в контроллере навигационной панели в Xcode

Итак, я хочу добавить "субтитры" под заголовком в панели навигации в навигационном контроллере.

В основном все, на что я смотрю, хочет, чтобы я использовал CGRect. Я не знаю, что это такое, и кажется, что он хочет, чтобы я создал совершенно новое представление, чего я не хочу делать.

Мой вопрос в том, есть ли точечный метод легко добавлять представление субтитров?

Самое близкое, что я нашел, было опубликовано в переполнении стека, и вот ссылка:

Создайте субтитры в панели навигации

По-видимому, в прошлом году это сработало, но теперь я получаю ошибки и его в моем представленииDidLoad...

Я пробовал это:

self.navigationController?.navigationItem.prompt = "Subtitle Here"

Это единственное, что не показывает никаких ошибок, но все равно не работает. Оно буквально ничего не делает. По крайней мере, ничего не видно во время выполнения.

В боковом примечании предпочтительным является быстрый. Спасибо!

4b9b3361

Ответ 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/...