Если вы хотите использовать поля по умолчанию в зависимости от разных устройств или разных версий, почему бы не попробовать автоматическое расположение?NSLayoutAttribute.LeadingMargin
означает передний край поля элемента по умолчанию.В вашем UITextSingleline
измените LayoutSubviews()
с жесткого кода на autolayout:
Предположим, что в ячейке есть только одна метка для отображения текста:
public override void LayoutSubviews()
{
base.LayoutSubviews();
var leadingConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.LeadingMargin, 1.0f, 0);
var topConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.TopMargin, 1.0f, 0);
var trailingConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.TrailingMargin, 1.0f, 0);
var bottomConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.BottomMargin, 1.0f, 0);
ContentView.AddConstraints(new NSLayoutConstraint[] { leadingConstraint, topConstraint, trailingConstraint, bottomConstraint });
}
Таким образом, headingLabel
будет иметь ту же компоновку, что и "TextLabel стандартной встроенной ячейки".
Более того, в вашем случае кажется, что вы хотите добавить UITextView
и в свою ячейку.Я рекомендую вам добавлять ограничения во время конструктора, я предоставляю вам свои ограничения, ссылаясь на:
public MyTableViewCell (IntPtr handle) : base (handle)
{
headingLabel = new UILabel()
{
Font = UIFont.SystemFontOfSize(17),
TextColor = UIColor.DarkTextColor,
BackgroundColor = UIColor.Clear,
Lines = 0
};
textBox = new UITextView()
{
ClipsToBounds = true,
Font = UIFont.SystemFontOfSize(16),
TextColor = UIColor.DarkTextColor
};
ContentView.AddSubview(headingLabel);
ContentView.AddSubview(textBox);
// Disable this to enable autolayout
headingLabel.TranslatesAutoresizingMaskIntoConstraints = false;
textBox.TranslatesAutoresizingMaskIntoConstraints = false;
doLayouts();
}
void doLayouts()
{
var leadingConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.LeadingMargin, 1.0f, 0);
var topConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Top, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.TopMargin, 1.0f, 0);
var trailingConstraint = NSLayoutConstraint.Create(headingLabel, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.TrailingMargin, 1.0f, 0);
ContentView.AddConstraints(new NSLayoutConstraint[] { leadingConstraint, topConstraint, trailingConstraint });
var boxLeading = NSLayoutConstraint.Create(textBox, NSLayoutAttribute.Leading, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.LeadingMargin, 1.0f, 0);
var boxTop = NSLayoutConstraint.Create(textBox, NSLayoutAttribute.Top, NSLayoutRelation.Equal, headingLabel, NSLayoutAttribute.Bottom, 1.0f, 4);
var boxTrailing = NSLayoutConstraint.Create(textBox, NSLayoutAttribute.Trailing, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.TrailingMargin, 1.0f, 0);
var boxBottom = NSLayoutConstraint.Create(textBox, NSLayoutAttribute.Bottom, NSLayoutRelation.Equal, ContentView, NSLayoutAttribute.BottomMargin, 1.0f, 0);
var boxHeight = NSLayoutConstraint.Create(textBox, NSLayoutAttribute.Height, NSLayoutRelation.Equal, null, NSLayoutAttribute.NoAttribute, 1.0f, 36 * MultiHeight);
ContentView.AddConstraints(new NSLayoutConstraint[] { boxLeading, boxTop, boxTrailing, boxBottom, boxHeight });
}
Еще одно преимущество использования AutoLayout: после установки RowHeight в TableView равным UITableView.AutomaticDimension
и EstimatedHeight, ячейкаавтоматически вычислит высоту строки в зависимости от ее содержимого, если мы установим правильные ограничения.