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

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

ただいまの
回答率

91.02%

  • iOS

    3452questions

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

  • Xamarin

    406questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。

Xamain.iOS TableView Cellの高さが自動調整について

解決済

回答 1

投稿

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

dfrd

score 2

 前提・実現したいこと

初めての質問になります。
よろしくお願いします。

Xamarin.iOSで、記事一覧を表示するアプリを開発しております。
TableViewで、TableCellを設置し、Styleを「Custom」の設定にしています。
=>この後、左側にサムネ(ImageView)など、複数のコンテンツを設置するため、「Custom」。

そのCellの中に、Labelを配置して、試しに、5個表示することはできました。
Labelそのものに、「ほげほげ・・・・ほげほげ」をいれてあります。

ただし、そのLabelの文字数を多くした場合、2行目の半分から、切り落とされた状態になってしまいます。
TableCellの行が、自動調整されてないからかと、推測をしております。

画像参照
イメージ説明

自分で色々と調べてみて、「TableView.ReloadData()」など、試してみましたが、うまくいきませんでした。

どのようにしたら、自動調整をしてくれますでしょうか・・・。

下記にソースコードを設置しますので、教えていただけますと嬉しいです。
よろしくお願いいたします。

 該当のソースコード

using Foundation;
using System;
using UIKit;
using System.Collections.Generic;

namespace SampleTableViewApp.iOS
{
    public partial class MyTableViewController : UITableViewController
    {
        public MyTableViewController (IntPtr handle) : base (handle)
        {
        }

        public override void ViewDidLoad()
        {
            base.ViewDidLoad();
            TableView.Source = new ListSource();
            TableView.ReloadData();
            //TableView.EstimatedRowHeight = 100;
            //TableView.RowHeight = UITableViewAutomaticDimension;
        }

        public override void WillDisplay(UITableView tableView, UITableViewCell cell, NSIndexPath indexPath)
        {  
            tableView.ReloadData();
            //if (cell.RespondsToSelector(new ObjCRuntime.Selector("setSeparatorInset:"))) cell.SeparatorInset = UIEdgeInsets.Zero;  
            //if (cell.RespondsToSelector(new ObjCRuntime.Selector("setLayoutMargins:"))) cell.LayoutMargins = UIEdgeInsets.Zero;  
        } 

        class ListSource : UITableViewSource
        {
            readonly List<string> _ar = new List<string> { "aaa", "bbb", "ccc", "ddd", "eee" };

            public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
            {
                var cell = tableView.DequeueReusableCell("MyCell");
                if (cell == null)
                {
                    // セルの生成(最初に各セルを1回だけ生成する)
                    cell = new UITableViewCell(UITableViewCellStyle.Default, "MyCell");
                }
                //tableView.ReloadData();
                //cell.TextLabel.Text = _ar[indexPath.Row];
                return cell;
            }

            public override nint RowsInSection(UITableView tableview, nint section)
            {
                //throw new NotImplementedException();
                return _ar.Count;
            }
        }
    }
}

 試したこと

  • TableView.ReloadData();
  • TableView.EstimatedRowHeight = 100;
  • Storyboardで、高さの設定
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+3

基本的にはUITableViewAutomaticDimensionを指定するだけでいけるとは思いますが
順番は以下のように変えてみると良いかも知れません。

これでカスタムセルの中身をAutoLayoutを使って配置すれば自動調整が働くはずです。

public override void ViewDidLoad()
{
    base.ViewDidLoad();
    TableView.EstimatedRowHeight = 100;
    TableView.RowHeight = UITableViewAutomaticDimension;
    TableView.Source = new ListSource();

}

以下は不要だと思いますが、上記設定だけで動かなかった時は念のためTableViewSource側にも定義した方が良いかもしれません。

TableViewSource

public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
{
    return UITableViewAutomaticDimension;
}

追記
CellのContentView内のUILabelの設定は以下のようにして複数行対応します。(していなかったら)

Label.Lines = 0;
Label.LineBreakMode = UILineBreakMode.WordWrap;

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2018/02/05 19:53

    回答ありがとうございます。
    こちら、ご教授して頂いたとおりに、編集してみたのですが、だめでした。

    もっとレイアウトの根本的なところなのでしょうか・・・。

    Storyboard上での
    UITableViewCellの設定がおかしいのかなぁと思ってたりします。

    補足情報として、
    ドキュメント アウトラインは
    TableView
    TableViewCell
    ContentView
    Label

    です。

    キャンセル

  • 2018/02/05 20:12

    UITableViewおよびTableSourceの方は多分問題ないのでカスタムCellに問題があるのだと思います。
    追記でUILabelの設定を書きましたが。これを既にした上でダメでしたらStoryboard上の設定の問題だと思います。
    しかし、Storyboardに関しては私は全くわからないので、その場合は他の回答者にお任せします。

    キャンセル

  • 2018/02/05 20:20

    さきほど、Stroyboard上で、ゴニョゴニョしてみたら、うまくいきました。
    内部にあるLabelに、上下左右に「Spacing」のConstrainsを設定してみたら、できました。

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

    キャンセル

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

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

関連した質問

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

  • iOS

    3452questions

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

  • Xamarin

    406questions

    Xamarin(ザマリン)は、iPhoneなどのiOSやAndroidで動作し、C# 言語を用いてアプリを開発できるクロスプラットフォーム開発環境です。Xamarin Studioと C# 言語を用いて、 iOS と Android の両方の開発を行うことができます。