在我开始之前,我已经访问了How to align text inside textView vertically? 和 How can you rotate text for UIButton and UILabel in Swift? 和其他许多地方,但以上链接(或我去过的任何地方)中概述的答案都没有解决我的问题。所以这是怎么回事:
在设备从纵向更改为横向后,我试图在UILabel中垂直显示文本。
我设法通过更改其框架大小并设置numberOfLines = 0来(强制)垂直堆叠它们。
这种产生所需结果的方法,除了旋转后每个字符之间都留有空格,大大延长了单词的长度。
请查看下面的图片,以更好地了解我的经历。
理想情况下,旋转后不会出现不必要的空白,并且像“纵向”中那样紧凑且紧凑。
有人知道我能做到这一点吗?在我的示例中,我使用的是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)
}
}
}
}
答案 0 :(得分:0)
更新:
经过更多调查后,行距已经为零,但实际上行高才是问题所在。
要解决此问题,请在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)
}
原始答案:
减小标签宽度时,每个字母都放在自己的行上。
行距对于阅读句子至关重要,但是由于这些行是同一单词的一部分,因此需要调整行距以使单词看起来连续。
this question上的答案涵盖了UILabel的行距。