Отобразить текст по вертикали в Swift? - PullRequest
1 голос
/ 09 июля 2019

Прежде чем начать, я посетил Как выровнять текст внутри textView по вертикали? и Как можно повернуть текст для UIButton и UILabel в Swift? и многих других местах, но ни одногоОтветы, изложенные в приведенных выше ссылках (или в любом другом месте, где я был), решают мою проблему.Итак, вот как это происходит:

Я пытаюсь отобразить текст в UILabel по вертикали после того, как устройство изменится на альбомную / книжную.

Мне удалось (принудительно) сложить их вертикально, изменивего размер кадра и установка numberOfLines = 0.

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

Пожалуйста, проверьте изображениениже, чтобы получить лучшее представление о том, что я испытываю.

Пробелы между символами

В идеале, после вращения не было бы лишних пробелов, и было бы неплохои компактный, как в Portrait.

Кто-нибудь знает, как мне этого добиться?В моем примере я использую UILabel, но ответ, использующий UITextView, тоже подойдет, если он работает.Ниже мой код:

import UIKit  

class ViewController: UIViewController {  

    var _W = CGFloat()  
    var _H = CGFloat()  

    var wordLabel: UILabel!  

    override func viewDidLoad() {  
        super.viewDidLoad()  
        _W = UIApplication.shared.statusBarOrientation.isPortrait ? view.frame.width : view.frame.height  
        _H = UIApplication.shared.statusBarOrientation.isPortrait ? view.frame.height : view.frame.width  
        wordLabel = UILabel()  
        wordLabel.text = "Text"  
        view.addSubview(wordLabel)  
        formatLabel(label: wordLabel, fontSize: 64, color: UIColor.magenta, tag: 1)  
    }  

    func formatLabel(label: UILabel, fontSize: CGFloat, color: UIColor, tag: Int) {  
        label.font = UIFont.boldSystemFont(ofSize: fontSize)  
        label.textColor = color  
        label.tag = tag  
        label.textAlignment = .center  
        label.adjustsFontSizeToFitWidth = true  
        label.numberOfLines = 0  
        positionView(label, isPortrait: UIApplication.shared.statusBarOrientation.isPortrait)  
    }  

    override func willTransition(to newCollection: UITraitCollection, with coordinator: UIViewControllerTransitionCoordinator) {  
        positionView(wordLabel, isPortrait: !UIApplication.shared.statusBarOrientation.isPortrait)  
   }

    func positionView(_ view: UIView, isPortrait: Bool) {  
        if (view.tag == 1) {  
            if (isPortrait) {  
                wordLabel.frame = CGRect(x: 0, y: 0, width: _W, height: 80)  
                wordLabel.center = CGPoint(x: _W/2, y: (_H - _W)/4)  
            } else {  
                wordLabel.frame = CGRect(x: 0, y: 0, width: 50, height: _W)  
                wordLabel.center = CGPoint(x: (_H - _W)/4, y: _W/2)  
            }  
        }  
    }  

} 

1 Ответ

0 голосов
/ 09 июля 2019

Обновление:

После более подробного изучения межстрочный интервал уже был равен нулю, но на самом деле проблема была в высоте строки.

Чтобы решить эту проблему, настройте высоту строки в функции formatLabel.

func formatLabel(label: UILabel, fontSize: CGFloat, color: UIColor, tag: Int) {  
    label.font = UIFont.boldSystemFont(ofSize: fontSize)  
    label.textColor = color  
    label.tag = tag  
    label.textAlignment = .center  
    label.adjustsFontSizeToFitWidth = true  
    label.numberOfLines = 0  

    if let text = label.text {

        let attributedString = NSMutableAttributedString(string: text)

        let paragraphStyle = NSMutableParagraphStyle()

        let newLineHeight = (label.font.lineHeight / 3) * 2

        paragraphStyle.minimumLineHeight = newLineHeight
        paragraphStyle.maximumLineHeight = newLineHeight
        paragraphStyle.alignment = label.textAlignment

        attributedString.setAttributes([NSAttributedString.Key.paragraphStyle: paragraphStyle], range: NSRange(location: 0, length: text.count))

        label.attributedText = attributedString

    }

    positionView(label, isPortrait: UIApplication.shared.statusBarOrientation.isPortrait)  
}  

Оригинальный ответ:

Когда ширина метки уменьшается, каждая буква помещается на отдельной строке.

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

Ответы на этот вопрос межстрочный интервал для UILabel.

...