2016-09-19 4 views
2

長い文章の単語をラップできるプログラムでラベルを作成したいと考えています。ラベルを作成するためのループは次のとおりです。iOS:プログラムでワードラップを使ってラベルを作成する

 for i in 0..<servicesLength 
    { 
     let label = UILabel(frame: CGRectMake(0, number, servicesScroll.bounds.size.width - 42, 25)) 
     label.lineBreakMode = .ByWordWrapping 
     label.numberOfLines = 0 
     label.font = UIFont(name: label.font.fontName, size: 25) 
     label.text = servicesList[i] 
     self.servicesScroll.addSubview(label) 
     number = number + 50 

    } 

この動作はありません。私が読んだことから、ラッピングが機能するようにするには、高さを設定したり、コンテンツの高さを大きくしたりする必要はありません。フレームの高さを設定する必要があり、大きな文に対しては非常に大きくしたくないので、プログラムですべてを設定することでどのように動作させることができますか?

+0

ラベルの高さを調整することによって、物事を捨てるように見えること以外は、私はそれを使用しています。それは高さを変えるのと同じ量だけすべてのラベルを押し下げます。これにより、上部に多くの空白が表示され、ラベルの一部がスクロールビューの下部を通過します。これを修正するにはどうすればよいですか? – user1715916

答えて

0

代わりにTableViewを使用することに決めました。それは私が探していたものを正確に私に与えました。表示された文章のリストが必要であり、大きな文章や段落のために単語の折り返しが必要な場合は、プログラムでラベルを追加するのではなく、テーブルビューを使うのが簡単です。

  1. は、スウィフトにテーブルビューを作成する方法についてのthisのチュートリアルに従ってください: は、ここで私が続くステップです。
  2. ワードラップを取得するためにセルを作成する関数にcell.textLabel?.numberOfLines = 0を追加します。
  3. をviewDidLoadに追加すると、行の可変高さを取得できます。
2

Autolayoutを使用しない理由は、デバイスの向きの変更にも対応します。

var lastLabel:UILabel? 

    for i in 0..<10servicesLength 
    { 
     let label = UILabel() 
     label.translatesAutoresizingMaskIntoConstraints=false 
     label.lineBreakMode = .ByWordWrapping 
     label.numberOfLines = 10 
     label.font = UIFont(name: label.font.fontName, size: 25) 
     label.text = servicesList[i] 
     servicesScroll.addSubview(label) 

     let metrics=["horizontalMargin":21,"top":0,"bottom":0,"separationBetweenLabels":0,"labelMinHeight":25] 
     let views=["label":label] 

     servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("H:|-horizontalMargin-[label]-horizontalMargin-|", 
      options: NSLayoutFormatOptions(rawValue: 0), 
      metrics: metrics, 
      views: views)) 

     if i == 0{ 
      servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:|-top-[label]", 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: metrics, 
       views: views)) 
     } 
     if let lastLabel=lastLabel{ 
      views["lastLabel"]=lastLabel 
      servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[lastLabel]-separationBetweenLabels-[label]", 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: metrics, 
       views: views)) 
     } 
     if i == (servicesLength-1){ 
      servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label]-bottom-|", 
       options: NSLayoutFormatOptions(rawValue: 0), 
       metrics: metrics, 
       views: views)) 
     } 

     //Optional a minimum height of 25 
     servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label(>=labelMinHeight)]", 
      options: NSLayoutFormatOptions(rawValue: 0), 
      metrics: metrics, 
      views: views)) 

     lastLabel=label 
    } 

重要な点は、各ラベルのnumberOfLinesを、ラベルを拡大できる最大サイズに設定することです。

また、私はmiminum高さの制約を追加します。

//Optional a minimum height of 25 
    servicesScroll.addConstraints(NSLayoutConstraint.constraintsWithVisualFormat("V:[label(25)]", 
     options: NSLayoutFormatOptions(rawValue: 0), 
     metrics: metrics, 
     views: views)) 

これは、ラベルは、この例では10行のうち少なくとも25の高さと最大であることを保証します。

+0

あなたの投稿をありがとう。私はアプリがランドスケープでうまく見えないので、水平方向をサポートしたくありませんでした。私は最大の高さの状況でハードコーディングを避けようとしていました。私はそれが終わるまで線を包むようにすることができたと思っていました。私は長い段落と文章だけの文章をいくつか持っています。私はあなたのコードとあなたの欠けているものを試して、ラベルの最初の開始点がどこにあるのかを知っているので、それらはすべて互いに上に置かれます。 – user1715916

+0

だから私はそれらを表示することができたラベルの間の高さとスペースを増加しようとしましたが、最初のラベルの前に空白がたくさんあります。スペースはラベルのために入れた高さと同じようです。スペースの塊を除いてすべてが素晴らしいようです。どのように私はこれを取り除くのですか? – user1715916

+0

申し訳ありませんが、私のコードに誤りがあり、私はそれを更新しました。もう一度確認してください。上部のスペースに問題はありません。 – omarzl

関連する問題