수색…


비고

더 많은 양의 데이터가있는 경우 행 높이 계산이 비쌀 수 있으며 스크롤링 성능이 저하 될 수 있습니다. 이 시나리오에서 UITableViewSource.EstimatedHeight(UITableView, NSIndexPath) 를 재정의하면 신속한 스크롤에 충분한 수를 신속하게 제공 할 수 있습니다 (예 :).

public override nfloat EstimatedHeight(UITableView tableView, NSIndexPath indexPath) 
{ 
    return 44.0f; 
}

GetHeightForRow 사용하기

사용자 정의 행 높이를 설정하려면 UITableViewSource.GetHeightForRow(UITableView,NSIndexPath) 재정의하십시오.

public class ColorTableDataSource : UITableViewSource
{
    List<DomainClass> Model { get; set; }

    public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
    {
        var height = Model[indexPath.Row % Model.Count].Height;
        return height;
    }
    
    //...etc ...
}

표의 도메인 클래스 (이 경우 3 개의 임의 색상 중 하나와 3 개의 임의 높이 중 1 개가 있음) :

public class DomainClass
{
    static Random rand = new Random(0);
    public UIColor Color { get; protected set; }
    public float Height { get; protected set; }

    static UIColor[] Colors = new UIColor[]
    {
        UIColor.Red,
        UIColor.Green,
        UIColor.Blue,
        UIColor.Yellow
    };

    public DomainClass()
    {
        Color = Colors[rand.Next(Colors.Length)];
        switch (rand.Next(3))
        {
            case 0:
                Height = 24.0f;
                break;
            case 1:
                Height = 44.0f;
                break;
            case 2:
                Height = 64.0f;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    public override string ToString()
    {
        return string.Format("[DomainClass: Color={0}, Height={1}]", Color, Height);
    }
}

어떤 모습입니까?

가변 테이블 행 높이

다음은 기술을 시연하는 완전한 프로그램입니다.

using System;
using System.Collections.Generic;
using System.Linq;

using Foundation;
using UIKit;
using System.Drawing;

namespace SingleFileTableViewSolution
{
  //Model
  public class DomainClass
  {
    static Random rand = new Random(0);
    public UIColor Color { get; protected set; }
    public float Height { get; protected set; }

    static UIColor[] Colors = new UIColor[]
    {
        UIColor.Red,
        UIColor.Green,
        UIColor.Blue,
        UIColor.Yellow
    };

    public DomainClass()
    {
        Color = Colors[rand.Next(Colors.Length)];
        switch (rand.Next(3))
        {
            case 0:
                Height = 24.0f;
                break;
            case 1:
                Height = 44.0f;
                break;
            case 2:
                Height = 64.0f;
                break;
            default:
                throw new ArgumentOutOfRangeException();
        }
    }

    public override string ToString()
    {
        return string.Format("[DomainClass: Color={0}, Height={1}]", Color, Height);
    }
  }

  //Table Source
  public class ColorTableDataSource : UITableViewSource
  {
    List<DomainClass> Model { get; set; }

    public ColorTableDataSource(List<DomainClass> model)
    {
        this.Model = model;
    }

    public override nint RowsInSection(UITableView tableView, nint section)
    {
        return 10000;
    }

    public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
    {
        var cell = tableView.DequeueReusableCell(ColoredTableCell.ID, indexPath);
        cell.ContentView.BackgroundColor = Model[indexPath.Row % Model.Count].Color;

        return cell;
    }

    public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath)
    {
        var height = Model[indexPath.Row % Model.Count].Height;
        return height;
    }

    public override void CellDisplayingEnded(UITableView tableView, UITableViewCell cell, NSIndexPath indexPath)
    {
        Console.WriteLine("CellDisplayingEnded on {0}", indexPath);
    }
  }

  public class ColoredTableCell : UITableViewCell
  {
    public static readonly NSString ID = new NSString("ColoredTableCell");
    public static int ClassCount = 0;
    public int myId = 0;

    public ColoredTableCell()
    {
    }

    public ColoredTableCell(IntPtr handle) : base(handle)
    {
        Console.WriteLine("New ColoredTableCell allocated {0} {1}", handle.ToInt64(), ClassCount++);
        myId = handle.ToInt32();
    }

    ~ColoredTableCell()
    {
        Console.WriteLine("ColoredTableCell {0} being finalized.", myId);
    }
  }

  public class ColorTableController : UITableViewController
  {
    String title;

    public ColorTableController(String title, UITableViewSource source) : base()
    {
        this.title = title;
        this.TableView.Source = source;

        this.TableView.RegisterClassForCellReuse(typeof(ColoredTableCell), ColoredTableCell.ID);
        this.TableView.TableHeaderView = new UIView(new RectangleF(0, 0, 500, 200));
        this.TableView.TableHeaderView.BackgroundColor = UIColor.Brown;
    }

    public override void DidReceiveMemoryWarning()
    {
        // Releases the view if it doesn't have a superview.
        base.DidReceiveMemoryWarning();
    }

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();

        Title = title;
    }
  }

  [Register("AppDelegate")]
  public class AppDelegate : UIApplicationDelegate
  {
    UIWindow window;
    ColorTableController viewController;

    public override bool FinishedLaunching(UIApplication app, NSDictionary options)
    {
        var models = new List<DomainClass>();
        for (int i = 0; i < 20; i++)
        {
            models.Add(new DomainClass());
        }

        var tableController = new ColorTableController("My Table", new ColorTableDataSource(models));

        window = new UIWindow(UIScreen.MainScreen.Bounds);
        window.RootViewController = tableController;

        window.MakeKeyAndVisible();

        return true;
    }
  }

  public class Application
  {
    static void Main(string[] args)
    {
        UIApplication.Main(args, null, "AppDelegate");
    }
  }
}


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow