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

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

ただいまの
回答率

90.50%

  • Swift

    7251questions

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

  • iOS

    3998questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

UITableViewの高さをセルの内容に応じて可変にする

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 1,138

lyzmfeqpxs54

score 139

いつもお世話になっております。

UITableViewのセルをカスタムセルとして作っており、そのセルを表示する際に、高さに合わせてUITableViewの高さを変更したいのですがうまくいきません。

調べた所
tableView.rowHeight = UITableViewAutomaticDimension
を使うように書いてある記事が多く以下のように記述したのですが、テーブルビューの高さは変わらず文字が下のセルにはみ出して表示してしまいます。

カスタムセルは左側に画像、右側にタイトルラベルと説明ラベルで構成されております。
StoryBoardは使用せずコードのみで作成しております。

正しい書き方をご教示いただければと思います。
よろしくお願いいたします。

環境
Xcode8.3.2
Swift3.0

HomeViewController.swift


import UIKit

class HomeViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {

    // テーブルビュー
    var tableView: UITableView!

    // 画像ファイルの名前
    let imageNames = ["1.jpeg", "2.jpeg", "3.jpeg", "4.jpeg"]

    // 画像のタイトル
    let imageTitles = ["A", "B", "C", "D"]

    // 画像の説明
    let imageDescriptions = [
        "短い文章",
        "短い文章",
        "長い文章〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜",
        "長い文章〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜"
    ]

    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = UIColor.white

        // テーブルビュー初期化、関連付け
        tableView               =   UITableView()
        tableView.frame         =   CGRect(x: 0, y: 50, width: 320, height: 400)
        tableView.delegate      =   self
        tableView.dataSource    =   self
        tableView.register(CustomTableViewCell.self, forCellReuseIdentifier: "customCell")
        tableView.estimatedRowHeight = 50
        tableView.rowHeight = UITableViewAutomaticDimension
        self.view.addSubview(tableView)
    }


    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return self.imageNames.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "customCell", for: indexPath) as! CustomTableViewCell
        cell.myImageView.image = UIImage(named: imageNames[indexPath.row])
        cell.myTitleLabel.text = self.imageTitles[indexPath.row]
        cell.myDescriptionLabel.text = self.imageDescriptions[indexPath.row]
        cell.myDescriptionLabel.sizeToFit()
        return cell
    }

    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        print("セルを選択しました! #\(indexPath.row)!")
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
    }
}





CustomTableViewCell.swift



import UIKit

class CustomTableViewCell: UITableViewCell {

    /// イメージを表示するImageView
    var myImageView: UIImageView!
    /// タイトルを表示するLabel
    var myTitleLabel: UILabel!
    /// 説明を表示するLabel
    var myDescriptionLabel: UILabel!


    override init(style: UITableViewCellStyle, reuseIdentifier: String!){
        //First Call Super
        super.init(style: style, reuseIdentifier: reuseIdentifier)

        myImageView = UIImageView()
        myImageView.frame = CGRect(x: 0, y: 0, width: 50, height: 50)
        myImageView.backgroundColor = UIColor.purple
        self.addSubview(myImageView)

        myTitleLabel = UILabel()
        myTitleLabel.frame = CGRect(x: 60, y: 0, width: 100, height: 20)
        myTitleLabel.backgroundColor = UIColor.red
        self.addSubview(myTitleLabel)

        myDescriptionLabel = UILabel()
        myDescriptionLabel.frame = CGRect(x: 60, y: 25, width: 100, height: 20)
        myDescriptionLabel.backgroundColor = UIColor.blue
        myDescriptionLabel.numberOfLines = 0
        self.addSubview(myDescriptionLabel)
    }

    required init(coder aDecoder: NSCoder){
        super.init(coder: aDecoder)!
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)

        // Configure the view for the selected state
    }

}
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • fuzzball

    2017/09/28 11:59

    「テーブルビューの高さは変わらず」←セルじゃなくて?

    キャンセル

  • lyzmfeqpxs54

    2017/09/28 12:04

    申し訳ございません。セルの高さです。

    キャンセル

回答 1

0

cellの中にラベルなどを入れていると思いますが、今回可変にしたいところの高さの大きさを決めていませんか?決めているとセルの大きさは変わらないです。(/ω\)

後ラベルの行数の指定は0にしてありますか?

    func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { 

        tableView.estimatedRowHeight = 20 //セルの高さ
        return UITableViewAutomaticDimension //自動設定
     }

のような感じにデリーゲートで指定していますか?
ここでの書き方はほんの一例ですが、一番説明しやすかったので書かさせていただきました!!(>ω<)

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/28 23:10

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

    書いてあるコードの通り、特に高さの大きさは決めておらず、ラベルも0行指定しております。ご教示いただいたコードを記述してみたのですが、セルの高さは特に変わらず、ラベルがセルをはみ出して表示している状態です。

    キャンセル

  • 2017/09/28 23:20

    myDescriptionLabel = UILabel()
    myDescriptionLabel.frame = CGRect(x: 60, y: 25, width: 100, height: 20)
    myDescriptionLabel.backgroundColor = UIColor.blue
    myDescriptionLabel.numberOfLines = 0
    self.addSubview(myDescriptionLabel)

    の高さを調節したいんですよね?コードみていませんでしたが、コードできっちり設定しているのでこれだと確かにできなさそうです。コードでなく直接cellに部品をはめてオートレイアウトの設定だと簡単ですが難しそうですか?(>ω<)コードでオートレイアウト書くと大変そうなので……

    キャンセル

  • 2017/09/29 00:44

    ご回答ありがとうございます。
    今回の開発ではコーディングのみで行いたいと考えており、なにか別の方法があればと思ってはいるのですが……。なにか別の方法やアプローチの仕方等教えていただければ幸いです。

    キャンセル

  • 2017/09/29 01:03

    http://kazuhei.hatenablog.com/entry/2015/06/08/225847
    を参考にして大きさ取得し適応する方法がいいのではないかと思います(>ω<)
    頑張ってください!!

    キャンセル

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

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

関連した質問

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

  • Swift

    7251questions

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

  • iOS

    3998questions

    iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。