2015-12-28 28 views
8

Sto provando a creare un auto-dimensionamento UITableView Cell. Dopo aver cercato su Google, ho trovato questo tutorial: https://pontifex.azurewebsites.net/self-sizing-uitableviewcell-with-uitextview-in-ios-8/ che è abbastanza buono.Xamarin ios come creare un UITableViewCell auto-dimensionante durante la modifica

In rapido, si dice che tableView?. BeginUpdates può aggiornare la dimensione della cella personalizzata. Ma sembra non funzionare in xamarin ios.

Qualcuno potrebbe aiutarmi? Grazie molto!

using System; 
using Foundation; 
using UIKit; 
using CoreGraphics; 

namespace Ma 
{ 
    public partial class DataInput : UITableViewCell 
    { 
     public string title { get; set;} 
     public static readonly UINib Nib = UINib.FromName ("DataInput", NSBundle.MainBundle); 
     public static readonly NSString Key = new NSString ("DataInput"); 

     public string value { get; set;} 

     public DataInput (IntPtr handle) : base (handle) 
     { 

     } 

     public static DataInput Create() 
     { 
      return (DataInput)Nib.Instantiate (null, null) [0]; 
     } 

     public void Populate() 
     { 
      this.Title.Text = this.title; 
      if (!string.IsNullOrEmpty(value)) { 
       this.Input.Text = this.value; 
      } 
     } 

     public string GetInputValue() 
     { 
      return this.Input.Text; 
     } 

     public UITableView GetTableView() 
     { 
      UITableView table = null; 

      UIView view = this.Superview; 
      if (view != null) { 
       table = (UITableView)view.Superview;      
      } 

      return table; 
     } 

     public override void AwakeFromNib() 
     { 
      base.AwakeFromNib(); 
      this.Input.ScrollEnabled = false; 
      this.Input.Delegate = new DataInputDelegate(); 
     } 

     public override void SetSelected (bool selected, bool animated) 
     { 
      base.SetSelected (selected, animated); 

      if (selected) { 
       this.Input.BecomeFirstResponder(); 
      } else { 
       this.Input.ResignFirstResponder(); 
      } 
     } 
    } 

    public partial class DataInputDelegate : UITextViewDelegate 
    { 
     public override void Changed (UITextView textView) 
     { 
      var size = textView.Bounds.Size; 
      var newSize = textView.SizeThatFits (new CGSize (size.Width, size.Height)); 

      if (size.Height != newSize.Height) { 
       UITextView.AnimationsEnabled = false; 

       UITableViewCell input = (UITableViewCell)textView.Superview.Superview; 
       UITableView tableView = (UITableView)input.Superview.Superview; 

       // This is the place of updating custom cell size, but It's not working now. 
       tableView.BeginUpdates(); 
       tableView.EndUpdates(); 
       UITextView.AnimationsEnabled = true; 

       var thisIndexPath = tableView.IndexPathForCell (input); 
       tableView.ScrollToRow (thisIndexPath, UITableViewScrollPosition.Bottom, false); 
      } 
     } 
    } 
} 

BTW, sto usando autolayout e impostare

TableView.EstimatedRowHeight = 50; 
TableView.RowHeight = UITableView.AutomaticDimension; 

E ho fatto la seguente impostazione pure.

public override nfloat GetHeightForRow(UITableView tableView, NSIndexPath indexPath) 
     { 
      if (indexPath.Row == 0) { 
       return 80.0f; 
      } 

      return UITableView.AutomaticDimension; 
     } 

Mille grazie se qualcuno mi può guidare!

risposta

4

In base ai vincoli posti sulla vista, il funzionamento automatico verrà eseguito. Il codice funziona bene dopo aver impostato i vincoli di ciascun componente.