質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.01%

  • Swift

    6084questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Swift ラベルの座標を動的にずらす方法

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 244

torkia

score 10

Swift3にて、UILabelを縦に並べて表示させた場合に、文字列が多いなどで改行させてラベルの高さを動的に可変させた場合に、それ以降に並んだラベルの座標位置を自動的にずらす方法を模索しているのですが、苦戦しております。

UILabelはコードで作成しているので、StoryboardのAutoLayoutではなく、コード記述でY座標をずらせる方法を教えて頂ければ助かります。

ラベルはspaceなしでq1Label~q11Labelの順番で上から縦に並べてあります。
表示させるテキストはcsvファイルから取得し、ランダムになるものとします。
例えば、q9Labelが文字列が多くて改行させて+20ラベルのheightを高くした場合、q10Label, q11Labelの表示位置(Y座標)を自動的に変えさせたいです。

ご教授、宜しくお願い致します。

■ サンプルコード   Swift3  xcode8

import UIKit

class FirstViewController: UIViewController {

    let q1Label = UILabel()
    let q2Label = UILabel()
    let q3Label = UILabel()
    let q4Label = UILabel()
    let q5Label = UILabel()
    let q6Label = UILabel()
    let q7Label = UILabel()
    let q8Label = UILabel()
    let q9Label = UILabel()
    let q10Label = UILabel()
    let q11Label = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()

        // CSVファイルを読み込む
        let csvArray = loadCSV("test")

        //csvArrayから取り出した問題を格納する配列qArray
        var qArray:[String] = []

        //csvArrayの行を取得
        qArray = csvArray[2].components(separatedBy: ";")

        // q1Label作成
        q1Label.text = qArray[5]
        q1Label.frame = CGRect(x: 20, y: 60, width: 335, height: 30)
        q1Label.textColor = UIColor.black
        q1Label.font = UIFont.systemFont(ofSize: 12)
        q1Label.backgroundColor = .gray
        view.addSubview(q1Label)

        // q2Label作成
        q2Label.text = qArray[7]
        q2Label.frame = CGRect(x: 20, y: q1Label.frame.maxY, width: 335, height: 30)
        q2Label.textColor = UIColor.black
        q2Label.font = UIFont.systemFont(ofSize: 12)
        q2Label.backgroundColor = .gray
        view.addSubview(q2Label)

        // q3Label作成
        q3Label.text = qArray[9]
        q3Label.frame = CGRect(x: 20, y: q2Label.frame.maxY, width: 335, height: 30)
        q3Label.textColor = UIColor.black
        q3Label.font = UIFont.systemFont(ofSize: 12)
        q3Label.backgroundColor = .gray
        view.addSubview(q3Label)

        // q4Label作成
        q4Label.text = qArray[11]
        q4Label.frame = CGRect(x: 20, y: q3Label.frame.maxY, width: 335, height: 30)
        q4Label.textColor = UIColor.black
        q4Label.font = UIFont.systemFont(ofSize: 12)
        q4Label.backgroundColor = .gray
        view.addSubview(q4Label)

        // q5Label作成
        q5Label.text = qArray[13]
        q5Label.frame = CGRect(x: 20, y: q4Label.frame.maxY, width: 335, height: 30)
        q5Label.textColor = UIColor.black
        q5Label.font = UIFont.systemFont(ofSize: 12)
        q5Label.backgroundColor = .gray
        view.addSubview(q5Label)

        // q6Label作成
        q6Label.text = qArray[15]
        q6Label.frame = CGRect(x: 20, y: q5Label.frame.maxY, width: 335, height: 30)
        q6Label.textColor = UIColor.black
        q6Label.font = UIFont.systemFont(ofSize: 12)
        q6Label.backgroundColor = .gray
        view.addSubview(q6Label)

        /// q7Label作成
        q7Label.text = qArray[17]
        q7Label.frame = CGRect(x: 20, y: q6Label.frame.maxY, width: 335, height: 30)
        q7Label.textColor = UIColor.black
        q7Label.font = UIFont.systemFont(ofSize: 12)
        q7Label.backgroundColor = .gray
        view.addSubview(q7Label)

        // q8Label作成
        q8Label.text = qArray[19]
        q8Label.frame = CGRect(x: 20, y: q7Label.frame.maxY, width: 335, height: 30)
        q8Label.textColor = UIColor.black
        q8Label.font = UIFont.systemFont(ofSize: 12)
        q8Label.backgroundColor = .gray
        view.addSubview(q8Label)

        // q9Label作成
        q9Label.text = qArray[21]
        q9Label.frame = CGRect(x: 20, y: q8Label.frame.maxY, width: 335, height: 30)
        q9Label.textColor = UIColor.black
        q9Label.font = UIFont.systemFont(ofSize: 12)
        q9Label.backgroundColor = .gray
        view.addSubview(q9Label)
        print("q9Label.frame.maxY: \(q9Label.frame.maxY)")


        // q10Label作成
        q10Label.text = qArray[23]
        q10Label.frame = CGRect(x: 20, y: q9Label.frame.maxY, width: 335, height: 30)
        q10Label.textColor = UIColor.black
        q10Label.font = UIFont.systemFont(ofSize: 12)
        q10Label.backgroundColor = .gray
        view.addSubview(q10Label)
        print("q9Label.frame.maxY: \(q9Label.frame.maxY)")

        // q11Label作成
        q11Label.text = qArray[25]
        q11Label.frame = CGRect(x: 20, y: q10Label.frame.maxY, width: 335, height: 30)
        q11Label.textColor = UIColor.black
        q11Label.font = UIFont.systemFont(ofSize: 12)
        q11Label.backgroundColor = .gray
        view.addSubview(q11Label)



        // UILabelを配列に入れる
        var qlabels = [UILabel]()

        // 配列labelsに追加するラベル
        qlabels.append(q1Label)
        qlabels.append(q2Label)
        qlabels.append(q3Label)
        qlabels.append(q4Label)
        qlabels.append(q5Label)
        qlabels.append(q6Label)
        qlabels.append(q7Label)
        qlabels.append(q8Label)
        qlabels.append(q9Label)
        qlabels.append(q10Label)
        qlabels.append(q11Label)


        // ■が含まれてる文字列がある場合は色を変える
        for i in qlabels {
            if (i.text?.contains("■"))! {
                i.backgroundColor = .cyan
            }
        }

        // 文字数が30より多い場合は改行させて、ラベルのheightを高くする
         for c in qlabels {
            if (c.text?.characters.count)! > 30 {
                c.numberOfLines = 0
                c.frame.size.height += 20
                c.frame = CGRect(x: 20, y: c.frame.origin.y, width: 335, height: c.frame.size.height)
            }
        }
    }

   (略)
}

■ 回答を参考に修正したコード

       // 文字数が30より多い場合は改行させて、ラベルのheightを高くする

       // offsetYを利用して座標をずらす方法
    var offsetY: CGFloat = 0 
        for c in qlabels {
            c.frame.origin.y += offsetY 
            if (c.text?.characters.count)! > 30 {
                c.numberOfLines = 0
                c.frame.size.height += 20
                offsetY += 20 
                c.frame = CGRect(x: 20, y: c.frame.origin.y, width: 335, height: c.frame.size.height)
            }
        }


        // maxYを利用して座標をずらす方法
        var maxY: CGFloat = 60   
        for c in qlabels {
            c.frame.origin.y = maxY
            if (c.text?.characters.count)! > 30 {
                c.numberOfLines = 0
                c.frame.size.height += 20
                c.frame = CGRect(x: 20, y: maxY, width: 335, height: c.frame.size.height)
            }
            maxY = c.frame.maxY
        }


        //  一つ前のラベル qlabels[c-1] を利用して座標をずらす方法
        for c in 0..<qlabels.count {
      qlabels[0].frame.origin.y = 60
            if c > 0 {
            qlabels[c].frame.origin.y = qlabels[c-1].frame.maxY
            }
            if (qlabels[c].text?.characters.count)! > 30 {
                qlabels[c].numberOfLines = 0
                qlabels[c].frame.size.height += 20
                qlabels[c].frame = CGRect(x: 20, y: qlabels[c-1].frame.maxY, width: 335, height: qlabels[c].frame.size.height)
            }
        }
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

今のコードを流用すれば、

var offsetY: CGFloat = 0 //※
for c in qlabels {
    c.frame.origin.y += offsetY //※今までにズレた分を足す
    if (c.text?.characters.count)! > 30 {
        c.numberOfLines = 0
        c.frame.size.height += 20
        offsetY += 20 //※
        c.frame = CGRect(x: 20, y: c.frame.origin.y, width: 335, height: c.frame.size.height)
    }
}

一つ前のラベルのmaxYを使う方がシンプルだと思いますけどね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/23 14:09

    ご回答ありがとうございます。
    c.frame.size.height += offsetY //※今までにズレた分を足す

    c.frame.origin.y += offsetY //※今までにズレた分を足す
    に変えたらできました。コピペミスですよね?ありがとうございました。

    >一つ前のラベルのmaxYを使う方がシンプルだと思いますけどね。
    どうやったらその方法でやれるんでしょうか?
    for-in文、if文の中での配列の中に入れたラベルの1つ前のラベルの取得方法がわかりませんでした。
    そのシンプルな方法などを、教えて頂ければ嬉しいです。

    キャンセル

  • 2018/01/23 14:36

    offsetYの代わりにmaxYを用意して、
    ・初期値 qlabels[0].frame.origin.y
    ・座標セット c.frame = CGRect(x: 20, y: maxY, ...(以下略)
    ・maxY更新 maxY = c.frame.maxY

    あるいは、普通(?)のforループを使って添字で配列にアクセスする。
    for i in 0..<qlabels.count {
    //qlabels[i-1] が一つ前のラベル
    }

    キャンセル

  • 2018/01/23 20:18 編集

    ご回答ありがとうございます。
    教えて頂いたことを参考にコード記述をしても適切なコードが記述できず、エラーがでてしまいます。
    > offsetYの代わりにmaxYを用意して
    var maxY: CGFloat
    for c in qlabels {
    qlabels[0].frame.origin.y = 60
    c.frame.origin.y = maxY
    if (c.text?.characters.count)! > 30 {
    c.numberOfLines = 0
    c.frame.size.height += 20
    c.frame = CGRect(x: 20, y: maxY, width: 335, height: c.frame.size.height)
    maxY = c.frame.maxY
    }
    }

    > あるいは、普通(?)のforループを使って添字で配列にアクセスする。
    var maxY: CGFloat
    for c in 0..<qlabels.count {
    if qlabels[c] == q1Label {
    qlabels[c].frame.origin.y = 60
    }
    qlabels[c].frame.origin.y = maxY
    if (qlabels[c] .text?.characters.count)! > 30 {
    qlabels[c].numberOfLines = 0
    qlabels[c].frame.size.height += 20
    qlabels[c].frame = CGRect(x: 20, y: qlabels[c].frame.origin.y, width: 335, height: qlabels[c].frame.size.height)
    maxY = qlabels[c-1].frame.maxY
    }
    }
    お時間ありましたら、修正箇所を教えて頂けると助かります。

    キャンセル

  • 2018/01/23 20:39

    上の方
    var maxY: CGFloat = 60 //初期値
    qlabels[0].frame.origin.y = 60 //この行は不要
    これでどうでしょう?

    キャンセル

  • 2018/01/23 20:50

    ご回答ありがとうございます。
    ダメでした。
    文字列の多いラベルのみ、y座標60のところから並んで表示されるようになってしまいます。

    キャンセル

  • 2018/01/23 22:00

    あー、 maxY = c.frame.maxY は if文の外に出して下さい。
    まだダメなら現状のコードを全て書いて下さい。(質問の方へ)

    少しは自分でも考えてくださいね。

    キャンセル

  • 2018/01/23 22:25

    お手数をおかけ致しました。ありがとうございました。

    キャンセル

+1

変わり種ですが、直前のラベル位置から制約を付ける方法。
sizeThatFits()で高さを算出しつつ、VFLで位置決めをしてます。

        // q1Label作成
        q1Label.text = qArray[5]
        //q1Label.frame = CGRect(x: 20, y: 60, width: 335, height: 30)
        q1Label.textColor = UIColor.black
        q1Label.font = UIFont.systemFont(ofSize: 12)
        q1Label.backgroundColor = .gray
        view.addSubview(q1Label)

         
         //(略)
         

        // 文字数が30より多い場合は改行させて、ラベルのheightを高くする
        var prev = qlabels[0]
        for i in 0..<qlabels.count {

            let objects = ["prev":prev,"next":qlabels[i]]
            objects.forEach { $1.translatesAutoresizingMaskIntoConstraints = false }

            qlabels[i].numberOfLines = 0
            qlabels[i].lineBreakMode = .byCharWrapping

            let rec = qlabels[i].sizeThatFits(CGSize(width:335,height:30))
            let tmp = ((qlabels[i].text?.count)! > 30) ? rec.height : 30
            let height = "".appendingFormat("%.0f", tmp)

            if i == 0 {
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[prev(==335)]", options: .alignAllLeft, metrics: nil, views: objects))
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[prev(==\(height))]", options: .alignAllLeft, metrics: nil, views: objects))
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[prev]", options: .alignAllLeft, metrics: nil, views: objects))
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[prev]", options: .alignAllLeft, metrics: nil, views: objects))
                continue
            }

            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[prev]-20-[next]", options: .alignAllLeft, metrics: nil, views: objects))
            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[next(==335)]", options: .alignAllLeft, metrics: nil, views: objects))
            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[next(==\(height))]", options: .alignAllLeft, metrics: nil, views: objects))

            prev = qlabels[i]
        }

実験
イメージ説明

追記:テストコード

import UIKit

class ViewController: UIViewController {

    let q1Label = UILabel()
    let q2Label = UILabel()
    let q3Label = UILabel()
    let q4Label = UILabel()
    let q5Label = UILabel()
    let q6Label = UILabel()
    let q7Label = UILabel()
    let q8Label = UILabel()
    let q9Label = UILabel()
    let q10Label = UILabel()
    let q11Label = UILabel()

    override func viewDidLoad() {
        super.viewDidLoad()

        // CSVファイルを読み込む
        //let csvArray = loadCSV("test")

        //csvArrayから取り出した問題を格納する配列qArray
        var qArray:[String] = [String](repeating: "a", count: 50)

        //csvArrayの行を取得
        //qArray = csvArray[2].components(separatedBy: ";")

        // q1Label作成
        q1Label.text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxxx"
        //q1Label.frame = CGRect(x: 20, y: 60, width: 335, height: 30)
        q1Label.textColor = UIColor.black
        q1Label.font = UIFont.systemFont(ofSize: 12)
        q1Label.backgroundColor = .gray
        view.addSubview(q1Label)

        // q2Label作成
        q2Label.text = qArray[7]
        //q2Label.frame = CGRect(x: 20, y: q1Label.frame.maxY, width: 335, height: 30)
        q2Label.textColor = UIColor.black
        q2Label.font = UIFont.systemFont(ofSize: 12)
        q2Label.backgroundColor = .gray
        view.addSubview(q2Label)

        // q3Label作成
        q3Label.text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxxx"
        q3Label.frame = CGRect(x: 20, y: q2Label.frame.maxY, width: 335, height: 30)
        q3Label.textColor = UIColor.black
        q3Label.font = UIFont.systemFont(ofSize: 12)
        q3Label.backgroundColor = .gray
        view.addSubview(q3Label)

        // q4Label作成
        q4Label.text = qArray[11]
        q4Label.frame = CGRect(x: 20, y: q3Label.frame.maxY, width: 335, height: 30)
        q4Label.textColor = UIColor.black
        q4Label.font = UIFont.systemFont(ofSize: 12)
        q4Label.backgroundColor = .gray
        view.addSubview(q4Label)

        // q5Label作成
        q5Label.text = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxxxaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaxxx"
        q5Label.frame = CGRect(x: 20, y: q4Label.frame.maxY, width: 335, height: 30)
        q5Label.textColor = UIColor.black
        q5Label.font = UIFont.systemFont(ofSize: 12)
        q5Label.backgroundColor = .gray
        view.addSubview(q5Label)

        // q6Label作成
        q6Label.text = qArray[15]
        q6Label.frame = CGRect(x: 20, y: q5Label.frame.maxY, width: 335, height: 30)
        q6Label.textColor = UIColor.black
        q6Label.font = UIFont.systemFont(ofSize: 12)
        q6Label.backgroundColor = .gray
        view.addSubview(q6Label)

        /// q7Label作成
        q7Label.text = qArray[17]
        q7Label.frame = CGRect(x: 20, y: q6Label.frame.maxY, width: 335, height: 30)
        q7Label.textColor = UIColor.black
        q7Label.font = UIFont.systemFont(ofSize: 12)
        q7Label.backgroundColor = .gray
        view.addSubview(q7Label)

        // q8Label作成
        q8Label.text = qArray[19]
        q8Label.frame = CGRect(x: 20, y: q7Label.frame.maxY, width: 335, height: 30)
        q8Label.textColor = UIColor.black
        q8Label.font = UIFont.systemFont(ofSize: 12)
        q8Label.backgroundColor = .gray
        view.addSubview(q8Label)

        // q9Label作成
        q9Label.text = qArray[21]
        q9Label.frame = CGRect(x: 20, y: q8Label.frame.maxY, width: 335, height: 30)
        q9Label.textColor = UIColor.black
        q9Label.font = UIFont.systemFont(ofSize: 12)
        q9Label.backgroundColor = .gray
        view.addSubview(q9Label)
        print("q9Label.frame.maxY: \(q9Label.frame.maxY)")


        // q10Label作成
        q10Label.text = qArray[23]
        q10Label.frame = CGRect(x: 20, y: q9Label.frame.maxY, width: 335, height: 30)
        q10Label.textColor = UIColor.black
        q10Label.font = UIFont.systemFont(ofSize: 12)
        q10Label.backgroundColor = .gray
        view.addSubview(q10Label)
        print("q9Label.frame.maxY: \(q9Label.frame.maxY)")

        // q11Label作成
        q11Label.text = qArray[25]
        q11Label.frame = CGRect(x: 20, y: q10Label.frame.maxY, width: 335, height: 30)
        q11Label.textColor = UIColor.black
        q11Label.font = UIFont.systemFont(ofSize: 12)
        q11Label.backgroundColor = .gray
        view.addSubview(q11Label)



        // UILabelを配列に入れる
        var qlabels = [UILabel]()

        // 配列labelsに追加するラベル
        qlabels.append(q1Label)
        qlabels.append(q2Label)
        qlabels.append(q3Label)
        qlabels.append(q4Label)
        qlabels.append(q5Label)
        qlabels.append(q6Label)
        qlabels.append(q7Label)
        qlabels.append(q8Label)
        qlabels.append(q9Label)
        qlabels.append(q10Label)
        qlabels.append(q11Label)


        // ■が含まれてる文字列がある場合は色を変える
        for i in qlabels {
            if (i.text?.contains("■"))! {
                i.backgroundColor = .cyan
            }
        }

        // 文字数が30より多い場合は改行させて、ラベルのheightを高くする
        var prev = qlabels[0]
        for i in 0..<qlabels.count {

            let objects = ["prev":prev,"next":qlabels[i]]
            objects.forEach { $1.translatesAutoresizingMaskIntoConstraints = false }

            qlabels[i].numberOfLines = 0
            qlabels[i].lineBreakMode = .byCharWrapping

            let rec = qlabels[i].sizeThatFits(CGSize(width:335,height:30))
            let tmp = ((qlabels[i].text?.count)! > 30) ? rec.height : 30
            let height = "".appendingFormat("%.0f", tmp)

            if i == 0 {
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[prev(==335)]", options: .alignAllLeft, metrics: nil, views: objects))
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[prev(==\(height))]", options: .alignAllLeft, metrics: nil, views: objects))
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:|-20-[prev]", options: .alignAllLeft, metrics: nil, views: objects))
                view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:|-60-[prev]", options: .alignAllLeft, metrics: nil, views: objects))
                continue
            }

            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[prev]-20-[next]", options: .alignAllLeft, metrics: nil, views: objects))
            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "H:[next(==335)]", options: .alignAllLeft, metrics: nil, views: objects))
            view.addConstraints(NSLayoutConstraint.constraints(withVisualFormat: "V:[next(==\(height))]", options: .alignAllLeft, metrics: nil, views: objects))

            prev = qlabels[i]
        }
    }

}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/01/23 20:33

    ご回答ありがとうございます。
    こちらの勉強不足で申し訳ないのですが、コードが難し過ぎて分からないので質問させて頂きます。
    記述して頂いたコードをコピペすると実験図のようにはならなかったのですが(文字列の多いラベルの高さが高くなっていないなど)どこを直せばいいか教えて頂ければ助かります。

    キャンセル

  • 2018/01/23 21:22 編集

    テスト用コードを追記しました。
    私の環境はSwift4のため、text?.characters.count を text?.countにしてます。

    キャンセル

  • 2018/01/23 22:03 編集

    追記コードありがとうございます。
    別のviewControllerファイルで追記コードだけを試すと実験図のようにちゃんとなるのですが、

    「// 文字数が30より多い場合は改行させて、ラベルのheightを高くする」
    以降のコードを私のコードの続きにコピペすると実験図のようにラベル高が変更されません。

    > text?.characters.count を text?.countにしてます。
    は修正して実行してます。

    >"V:[prev]-20-[next]"
    のところの20を0に変更してスペースを空けず縦に並べて表示させてます。

    文字列が多い場合の高さ変更はどの部分のコードで指示を与えているのかが分かりませんでした。
    csvから読み込んだ文字列の多いラベルの高さを変更させるにはどこを変更すればよろしいでしょうか?
    csvから読み込むテキストは改行しても2行ぐらいの文字数なのでFont12の場合だとデフォルトの高さ30でもおさまるのですが、それの違いでしょうか?デフォルトで設定してある高さに+20したいのですが・・。

    キャンセル

  • 2018/01/23 22:03

    1番目のラベル高も可変になりませんか?

    キャンセル

  • 2018/01/23 22:05

    あと文字カウントが正常かどうかも確認してください。

    キャンセル

  • 2018/01/23 22:13

    ご回答ありがとうございます。

    let tmp = ((qlabels[i].text?.count)! > 30) ? rec.height : 30
    の rec.height : 30 のところを あえて小さく12にして試したところ
    文字数の多いラベルは改行されてラベル高さも文字が収まる高さに広がってました。

    できれば、rec.height: 30のままで、文字列の多いラベルのみ高さを広げてそれ以降のラベルに反映させたいのですが、できますでしょうか?

    キャンセル

  • 2018/01/23 22:23

    それはcsvに30文字超えるデータがいないだけでは?

    キャンセル

  • 2018/01/23 22:32

    度々ありがとうございます。
    このサンプルコードで呼んでいるのにはq9Labelとq11Labelに30文字以上あって、ちゃんと改行はされてます。ただラベルの中に文字が収まっているので高くならないのかと思います。文字が詰まってるので余白をとりたくて+20にして可変させたかったのですが・・・。

    キャンセル

  • 2018/01/24 22:01

    なんとかやりたいことができました。
    let rec~, let tmp~, let height~ の3行分を以下のコードに変更

    qlabels[i].frame.size = CGSize(width: 335, height: 30)
    let rec = qlabels[i].frame.size
    var tmp = rec.height
    print("rec.height: \(rec.height)")
    if ((qlabels[i].text?.characters.count)! > 30) {
    tmp += 20
    }
    let height = "".appendingFormat("%.0f", tmp)

    これで高さが+20されました。
    お手数をおかけ致しました。ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.01%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Swift

    6084questions

    Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています