複数行のラベルの最適な幅を計算して、固定高さの水平行に複数のラベルを貼り付ける方法を作成したいと思います。スウィフトの複数行テキストの最適なラベル幅を計算する方法
let textAttributes: [String : Any] = [NSFontAttributeName: UIFont.preferredFont(forTextStyle: UIFontTextStyle.title2)]
let maximalWidth: CGFloat = text!.boundingRect(
with: CGSize(width: CGFloat.greatestFiniteMagnitude, height: height),
options: [NSStringDrawingOptions.usesLineFragmentOrigin],
attributes: textAttributes,
context: nil).size.width
は、私の知る限り理解されるように、私はいくつかのラインを持っていることを、ここに示すオプションはありません:テキストの1行で
は問題ありません。このメソッドは、固定幅のテキストの高さを計算するとき、他の方向にもうまく機能します。しかし、私は反対の目標を持っています。変形例として
、私は最も長い単語(私たちは、同じ文字を複数の単語カウントが、異なるレンダリングされた幅を持つことができるよう、最も広い言葉に基づいて、より正確には)に基づいてラベルを作成することができます。
をvar sizeToReturn = CGSize()
let maxWordsCharacterCount = text?.maxWord.characters.count
let allLongWords: [String] = text!.wordList.filter {$0.characters.count == maxWordsCharacterCount}
var sizes: [CGFloat] = []
allLongWords.forEach {sizes.append($0.size(attributes: attributes).width)}
let minimalWidth = (sizes.max()! + constantElementsWidth)
私は言葉のリストを作成し、すべての最長見つけるためにここに2つの文字列の拡張機能を使用:
extension String {
var wordList: [String] {
return Array(Set(components(separatedBy: .punctuationCharacters).joined(separator: "").components(separatedBy: " "))).filter {$0.characters.count > 0}
}
}
extension String {
var maxWord: String {
if let max = self.wordList.max(by: {$1.characters.count > $0.characters.count}) {
return max
} else {return ""}
}
}
悪くない選択肢を、私たちは肝炎場合、それは醜いですe 3行に収まらないテキストで、最後にいくつかの短い単語と長い単語が1つあります。この長い単語は、幅を決定しただけで切り捨てられます。そして、それはのような3つの短い言葉であまりにも良いではないに見えることのより:
- 売る
- 車
はまあ、私は最大の幅を持って、最小の幅を持っています。おそらく、 は最大から最小になり、ラベルが切り捨てられ始めるときに捕捉できます。 私は優雅な解決策があると感じますが、私は立ち往生しています。
自動レイアウト制約を使用して、保持するコンテンツに基づいて必要に応じてラベルのサイズを設定する必要があります。ストーリーボードでこれを行うのは簡単ですが、必要に応じてプログラムでも行うことができます。私は自動レイアウトに関するいくつかの調査を行います:https://www.raywenderlich.com/115440/auto-layout-tutorial-in-ios-9-part-1-getting-started-2 – user3353890
私はautolayoutこの場合に役立ちます。 –
私は幅を知っていれば、ラベルのサイズを変更することは問題ではないことを意味します。しかし、私はこの幅を計算することはできません。 –