如何在 xamarin 中自动调整 UITableView 的行高 ios
How to resize the row height of a UITableView automatically in xamarin ios
我是新手 xamarin.ios 我想根据内容长度调整行高。我该怎么做。
这是我的 ViewController.Cs
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
nfloat _width = UIScreen.MainScreen.Bounds.Width / 3;
DataBinding();
_table = new UITableView(new CGRect(0, 0, View.Frame.Width, View.Frame.Height));
_table.Source = new DetailsTableViewSource(_caseDesign);
_table.RowHeight = UITableView.AutomaticDimension;
_table.EstimatedRowHeight = 100f;
_table.ReloadData();
View.AddSubview(_table);
}
DetailsTableViewSource.Cs
public class DetailsTableViewSource : UITableViewSource
{
public List<CaseDetails> tabledata;
public DetailsTableViewSource(List<CaseDetails> items)
{
tabledata = items;
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
NSString cellIdentifier = new NSString();
var cell = tableView.DequeueReusableCell(cellIdentifier) as CaseDetailsTableCell;
if (cell == null)
cell = new CaseDetailsTableCell(cellIdentifier);
cell.UpdateCell(tabledata[indexPath.Row].Title
, tabledata[indexPath.Row].Description
);
return cell;
}
public override nint RowsInSection(UITableView tableview, nint section)
{
return tabledata.Count;
}
}
CaseDetailsTableCell.cs
public class CaseDetailsTableCell:UITableViewCell
{
UILabel _qst1, _answer1, _seperator;
nfloat _width;
public CaseDetailsTableCell(NSString cellId) : base(UITableViewCellStyle.Default, cellId)
{
_width = UIScreen.MainScreen.Bounds.Width / 3;
_qst1 = new UILabel();
_qst1.Font = _qst1.Font.WithSize(15);
_seperator = new UILabel();
_seperator.TextAlignment = UITextAlignment.Center;
_seperator.Text = ":";
_seperator.Font = _seperator.Font.WithSize(20);
_answer1 = new UILabel();
_answer1.Font = _answer1.Font.WithSize(15);
ContentView.AddSubviews(new UIView[] { _qst1, _seperator, _answer1 });
}
public void UpdateCell(string Quetion, string Answer)
{
_qst1.Text = Quetion;
_answer1.Text = Answer;
}
public override void LayoutSubviews()
{
base.LayoutSubviews();
_qst1.Frame = new CGRect(10, 10, _width + 10, 30);
_qst1.Lines = 0;
_qst1.SizeToFit();
_qst1.LineBreakMode = UILineBreakMode.Clip;
_qst1.TextAlignment = UITextAlignment.Left;
_answer1.Frame = new CGRect(_width * 2, 10, UIScreen.MainScreen.Bounds.Width / 3 - 10, 30);
_answer1.SizeToFit();
_answer1.TextAlignment = UITextAlignment.Justified;
_answer1.LineBreakMode = UILineBreakMode.WordWrap;
_seperator.Frame = new CGRect(_width + 10, 10, UIScreen.MainScreen.Bounds.Width / 3, 30);
// _date.Frame = new CGRect(17, 50, 50, 20);
}
}
我想绑定一些数据到table中,每一项的长度不一样,根据数据的长度自动调整行高。我怎样才能做到这一点。
现在 table 看起来像这样
我想要这样的table
如果您想自动调整 tableView 的行高,您应该使用 autoLayout 将控件放在单元格而不是框架中。也把constraints代码放在cell的constructor里会更好:
public CaseDetailsTableCell(NSString cellId) : base(UITableViewCellStyle.Default, cellId)
{
_width = UIScreen.MainScreen.Bounds.Width / 3;
_qst1 = new UILabel();
_qst1.Font = _qst1.Font.WithSize(15);
_seperator = new UILabel();
_seperator.TextAlignment = UITextAlignment.Center;
_seperator.Text = ":";
_seperator.Font = _seperator.Font.WithSize(20);
_answer1 = new UILabel();
_answer1.Font = _answer1.Font.WithSize(15);
ContentView.AddSubviews(new UIView[] { _qst1, _seperator, _answer1 });
// Disable this to enable autoLayout
_qst1.TranslatesAutoresizingMaskIntoConstraints = false;
var qstLeading = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1, 10);
var qstTop = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1, 10);
var qstWidth = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, _width + 10);
var qstBottom = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Bottom, NSLayoutRelation.LessThanOrEqual, ContentView, NSLayoutAttribute.Bottom, 1, -10);
_qst1.Lines = 0;
_qst1.SizeToFit();
_qst1.LineBreakMode = UILineBreakMode.Clip;
_qst1.TextAlignment = UITextAlignment.Left;
_qst1.BackgroundColor = UIColor.Blue;
_seperator.TranslatesAutoresizingMaskIntoConstraints = false;
var sepLeading = NSLayoutConstraint.Create(_seperator, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, _qst1, NSLayoutAttribute.Trailing, 1, 10);
var sepTop = NSLayoutConstraint.Create(_seperator, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1, 10);
var sepWidth = NSLayoutConstraint.Create(_seperator, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, UIScreen.MainScreen.Bounds.Width / 3);
_seperator.BackgroundColor = UIColor.Yellow;
_answer1.TranslatesAutoresizingMaskIntoConstraints = false;
var ansLeading = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, _seperator, NSLayoutAttribute.Trailing, 1, 10);
var ansTop = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1, 10);
var ansTrailing = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Trailing, 1, -10);
var ansBottom = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Bottom, NSLayoutRelation.LessThanOrEqual, ContentView, NSLayoutAttribute.Bottom, 1, -10);
_answer1.SizeToFit();
_answer1.TextAlignment = UITextAlignment.Justified;
_answer1.LineBreakMode = UILineBreakMode.WordWrap;
_answer1.BackgroundColor = UIColor.Red;
_answer1.Lines = 0;
ContentView.AddConstraints(new NSLayoutConstraint[] { qstTop, qstLeading, qstWidth, qstBottom, sepLeading, sepTop, sepWidth, ansLeading, ansTop, ansTrailing, ansBottom });
}
在这里,我将 LessThanOrEqual
NSLayoutRelation 添加到 _qst1 和 _answer1 标签的底部约束,单元格将根据最高的单元格调整其高度。您可以调整约束以满足您的要求。
我是新手 xamarin.ios 我想根据内容长度调整行高。我该怎么做。
这是我的 ViewController.Cs
public override void ViewWillAppear(bool animated)
{
base.ViewWillAppear(animated);
nfloat _width = UIScreen.MainScreen.Bounds.Width / 3;
DataBinding();
_table = new UITableView(new CGRect(0, 0, View.Frame.Width, View.Frame.Height));
_table.Source = new DetailsTableViewSource(_caseDesign);
_table.RowHeight = UITableView.AutomaticDimension;
_table.EstimatedRowHeight = 100f;
_table.ReloadData();
View.AddSubview(_table);
}
DetailsTableViewSource.Cs
public class DetailsTableViewSource : UITableViewSource
{
public List<CaseDetails> tabledata;
public DetailsTableViewSource(List<CaseDetails> items)
{
tabledata = items;
}
public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
NSString cellIdentifier = new NSString();
var cell = tableView.DequeueReusableCell(cellIdentifier) as CaseDetailsTableCell;
if (cell == null)
cell = new CaseDetailsTableCell(cellIdentifier);
cell.UpdateCell(tabledata[indexPath.Row].Title
, tabledata[indexPath.Row].Description
);
return cell;
}
public override nint RowsInSection(UITableView tableview, nint section)
{
return tabledata.Count;
}
}
CaseDetailsTableCell.cs
public class CaseDetailsTableCell:UITableViewCell
{
UILabel _qst1, _answer1, _seperator;
nfloat _width;
public CaseDetailsTableCell(NSString cellId) : base(UITableViewCellStyle.Default, cellId)
{
_width = UIScreen.MainScreen.Bounds.Width / 3;
_qst1 = new UILabel();
_qst1.Font = _qst1.Font.WithSize(15);
_seperator = new UILabel();
_seperator.TextAlignment = UITextAlignment.Center;
_seperator.Text = ":";
_seperator.Font = _seperator.Font.WithSize(20);
_answer1 = new UILabel();
_answer1.Font = _answer1.Font.WithSize(15);
ContentView.AddSubviews(new UIView[] { _qst1, _seperator, _answer1 });
}
public void UpdateCell(string Quetion, string Answer)
{
_qst1.Text = Quetion;
_answer1.Text = Answer;
}
public override void LayoutSubviews()
{
base.LayoutSubviews();
_qst1.Frame = new CGRect(10, 10, _width + 10, 30);
_qst1.Lines = 0;
_qst1.SizeToFit();
_qst1.LineBreakMode = UILineBreakMode.Clip;
_qst1.TextAlignment = UITextAlignment.Left;
_answer1.Frame = new CGRect(_width * 2, 10, UIScreen.MainScreen.Bounds.Width / 3 - 10, 30);
_answer1.SizeToFit();
_answer1.TextAlignment = UITextAlignment.Justified;
_answer1.LineBreakMode = UILineBreakMode.WordWrap;
_seperator.Frame = new CGRect(_width + 10, 10, UIScreen.MainScreen.Bounds.Width / 3, 30);
// _date.Frame = new CGRect(17, 50, 50, 20);
}
}
我想绑定一些数据到table中,每一项的长度不一样,根据数据的长度自动调整行高。我怎样才能做到这一点。
现在 table 看起来像这样
我想要这样的table
如果您想自动调整 tableView 的行高,您应该使用 autoLayout 将控件放在单元格而不是框架中。也把constraints代码放在cell的constructor里会更好:
public CaseDetailsTableCell(NSString cellId) : base(UITableViewCellStyle.Default, cellId)
{
_width = UIScreen.MainScreen.Bounds.Width / 3;
_qst1 = new UILabel();
_qst1.Font = _qst1.Font.WithSize(15);
_seperator = new UILabel();
_seperator.TextAlignment = UITextAlignment.Center;
_seperator.Text = ":";
_seperator.Font = _seperator.Font.WithSize(20);
_answer1 = new UILabel();
_answer1.Font = _answer1.Font.WithSize(15);
ContentView.AddSubviews(new UIView[] { _qst1, _seperator, _answer1 });
// Disable this to enable autoLayout
_qst1.TranslatesAutoresizingMaskIntoConstraints = false;
var qstLeading = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Leading, 1, 10);
var qstTop = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1, 10);
var qstWidth = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, _width + 10);
var qstBottom = NSLayoutConstraint.Create(_qst1, NSLayoutAttribute.Bottom, NSLayoutRelation.LessThanOrEqual, ContentView, NSLayoutAttribute.Bottom, 1, -10);
_qst1.Lines = 0;
_qst1.SizeToFit();
_qst1.LineBreakMode = UILineBreakMode.Clip;
_qst1.TextAlignment = UITextAlignment.Left;
_qst1.BackgroundColor = UIColor.Blue;
_seperator.TranslatesAutoresizingMaskIntoConstraints = false;
var sepLeading = NSLayoutConstraint.Create(_seperator, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, _qst1, NSLayoutAttribute.Trailing, 1, 10);
var sepTop = NSLayoutConstraint.Create(_seperator, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1, 10);
var sepWidth = NSLayoutConstraint.Create(_seperator, NSLayoutAttribute.Width, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 0, UIScreen.MainScreen.Bounds.Width / 3);
_seperator.BackgroundColor = UIColor.Yellow;
_answer1.TranslatesAutoresizingMaskIntoConstraints = false;
var ansLeading = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, _seperator, NSLayoutAttribute.Trailing, 1, 10);
var ansTop = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Top, 1, 10);
var ansTrailing = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.Trailing, 1, -10);
var ansBottom = NSLayoutConstraint.Create(_answer1, NSLayoutAttribute.Bottom, NSLayoutRelation.LessThanOrEqual, ContentView, NSLayoutAttribute.Bottom, 1, -10);
_answer1.SizeToFit();
_answer1.TextAlignment = UITextAlignment.Justified;
_answer1.LineBreakMode = UILineBreakMode.WordWrap;
_answer1.BackgroundColor = UIColor.Red;
_answer1.Lines = 0;
ContentView.AddConstraints(new NSLayoutConstraint[] { qstTop, qstLeading, qstWidth, qstBottom, sepLeading, sepTop, sepWidth, ansLeading, ansTop, ansTrailing, ansBottom });
}
在这里,我将 LessThanOrEqual
NSLayoutRelation 添加到 _qst1 和 _answer1 标签的底部约束,单元格将根据最高的单元格调整其高度。您可以调整约束以满足您的要求。