2017-01-17 6 views
0

私はadjustsFontSizeToFitWidthtrueに設定されたUILabelsの数を持っています。それらはすべて異なるサイズであり、それらの内部のテキストの長さは異なるため、本質的に各ラベルのテキストのサイズは任意です。adjustsFontSizeToFitWidthで異なるサイズのUILabelsを作成すると、同じフォントサイズになります

私の目標は、テキストサイズをすべて同じにすることです。その結果、各ラベルが適合するためにはテキストのサイズがどれくらいであるかを決定した後、すべてのテキストのサイズを最小のフォントサイズUILabelsの中で。これは、各ラベルのテキストが収まるのに十分小さい、最大のフォントサイズです。

また、ラベルごとに、テキストを収める最大のフォントサイズを手動で計算し、各ラベルのフォントサイズを最小のフォントサイズに設定することも考えましたが、この計算を行う。

+0

サブビューをループすることができますか?UILabelsのみをチェックしてフォントサイズを引き出してから、もう一度ループして、各ラベルを必要なフォントサイズに設定しますか? – dfd

+0

手動で計算する必要があるかもしれません。私はちょうど私の提案のテストを設定し、フィットするように調整されたフォントサイズがUILabel.font.pointSize値に反映されないように見えます。彼らはすべて17に戻ってきた: -/ – dfd

+0

@dfd私はそうだと思います。縮んだ後に表示されるフォントサイズは、ラベルのフォントに格納されているフォントサイズとは関係ありません。セルがテキストをレイアウトする前に最終的なサイズを計算する方法を知っていますか?これは私の問題を解決するだろう。 – BallpointBen

答えて

0

必要な最小サイズを見つけるには、ラベルを反復処理する必要があります。私はちょうど、表示する必要のあるフォントの最小サイズを見つけるために、同じラベルに文字列の配列を繰り返し処理しています。このコード

let label = UILabel(frame: CGRect(x: 0, y: 0, width: 100, height: 10)) 
    let textArray = ["asdasdas","asdsd","asdas"] 
    let size : CGFloat = 14 
    var minimumSize = size 
    for string in textArray{ 
     var i : CGFloat = 0 
     while size-i>0 { 
      let font = UIFont.systemFont(ofSize: size-i) 
      let preferredSize = label.preferredLabelSize(maximumFrameBounds: view.frame, font: font, text: string) 
      if label.frame.size.width>=preferredSize.width{ 
       minimumSize = min(size-i, minimumSize) 
       print(minimumSize) 
       break 
      } 
      i += 1 
     } 
     print(minimumSize) 
    } 

を確認してください。これが完全に機能するかどうかはわかりませんが、これは正しい方向を指します。文字列の配列を繰り返し処理するのではなく、最小のフォントサイズを見つけるために、テキストでラベルを繰り返し処理する必要があります。配列内のラベルまたは文字列の幅を変更して、目的のとおりに動作するかどうかを調べることができます。また、フォントサイズを手動で計算するのではなく、自動レイアウトを使用してOSがそのサイズを処理できるようにすることをお勧めします。

+0

ありがとうございます。自動レイアウトの問題は、ラベルがすべて同じサイズ(私の場合は重要ですが重要ではありません)で、長さの異なるテキストを含む場合(重要な場合)、それぞれのサイズがテキストのサイズに合わせて調整されますそれは長い文字列が小さいフォントサイズを取得することを意味します。私はすべてのラベルの文字列を同じ(最小)フォントサイズにします。基本的に、私はラベルのフォントサイズを等しくするように制約したいが、自動レイアウトはそのようなことを許さない。 – BallpointBen

+0

自動レイアウトでテキストサイズのサイズが変更されない場合、高さ/幅を指定せずにラベルを複数行にすると、ラベルのフレームサイズが変更されます。しかし、ええ、私はあなたがすべてのラベルが同じサイズであることを望んでいることを理解しています:) – ebby94

+0

しかし、私はあなたの答えは動作するはずだと思います。ただ1つの質問:自動レイアウトと互換性がありますか?ローテーション変更時にsetNeedsDisplay()を行う必要がありますか?とにかく、いつかすぐに試してみます。ありがとう。 – BallpointBen

関連する問題