Как я могу предоставить пользовательский UITableCell для UITableView с теми же показателями компоновки, что и у встроенной ячейки? - PullRequest
0 голосов
/ 30 мая 2018

Когда я добавляю подпредставление в ячейку таблицы-прототипа, скажем, UITextView, тогда по умолчанию нет левого поля.Я хотел бы, чтобы он использовал тот же запас, который использует iOS для встроенных стандартных макетов ячеек.В случае, если я упускаю очевидное, где находится флаг «использовать устройство / iOS по умолчанию»?В противном случае, моим предпочтительным решением будет способ запрашивать у устройства метрики пользовательского интерфейса, зависящие от устройства и версии iOS.Для целей этого вопроса мы можем ограничить это только показателями элемента управления UITableView и его потомков UITableCell.

Вот как я генерирую свою пользовательскую ячейку:

    internal class UITextSingleline : UITableViewCell
    {
        UILabel headingLabel;
        UITextView textBox;
        int MultiHeight;
        public bool secure; 

        public UITextSingleline() : this(null, 1) { }
        public UITextSingleline(int multiheight) : this(null, multiheight) { }
        public UITextSingleline(NSString cellId, int multiheight) : base(UITableViewCellStyle.Default, cellId) 
        {
            MultiHeight = multiheight;
            SelectionStyle = UITableViewCellSelectionStyle.None;            
            headingLabel = new UILabel()
            {
                Font = UIFont.SystemFontOfSize(16),
                TextColor = UIColor.DarkTextColor,
                BackgroundColor = UIColor.Clear
            };

            textBox = new UITextView()
            {                
                ClipsToBounds = true,
                Font = UIFont.SystemFontOfSize(16),
                TextColor = UIColor.DarkTextColor
            };

            if (multiheight == 1) textBox.TextContainer.MaximumNumberOfLines = 1;
            textBox.Layer.CornerRadius = 10.0f;
            textBox.Layer.BorderColor = UIColor.DarkTextColor.CGColor;
            textBox.Layer.BorderWidth = 1f;
            ContentView.AddSubviews(new UIView[] { headingLabel, textBox });               
        }

        public override void LayoutSubviews()
        {
            base.LayoutSubviews();
            headingLabel.Frame = new CGRect(16, 8, ContentView.Bounds.Width - 32, 20);
            textBox.Frame = new CGRect(16, 32, ContentView.Bounds.Width - 32, 36 * MultiHeight); /* see? magic numbers all over the place */
        }

        public void UpdateCell(string caption, string text)
        {            
            headingLabel.Text = caption;
            textBox.Text = text;                   
        }

        public string Text
        {
            get
            {
                return textBox?.Text;
            }
            set
            {
                if (textBox != null) textBox.Text = value;
            }
        }
    }

И вот как это связано с представлением содержащейся таблицы:

public override UITableViewCell GetCell(UITableView tableView, NSIndexPath indexPath)
{
    switch (indexPath.Section)
    {
        case 0:
            /* area/workplace */
            switch (indexPath.Row)
            {
                case 0:
                    /* area picker (omitted) */
                case 1:
                    /* workplace text input (single-line) */
                    if (txtWorkplace == null)
                    {
                        txtWorkplace = new UITextSingleline();
                        txtWorkplace.UpdateCell("Workplace", Data.Instance.Payload.report.workplace);
                    }
                    return txtWorkplace;
            }
            break;
        case 1:
            /* rest ommitted for brevity */
            break;
    }
    return null;
}

Я искал в SO и в Интернете эквивалент системной метрики, есть много цветов и шрифтов, но я нашел только немного информациио размерах, полях, вставках, угловых радиусах и тому подобном:

  • Этот вопрос имеет дело с противоположным, избавляясь от любых полей, и не упоминает, как повторитьiOS по умолчанию.
  • На этой странице от Apple dev упоминается свойство separatorInset всего TableView, которое, похоже, работает для левого отступа, но я несколько скептически отношусь к применениюметрика для одной части макета в другую.

Закодированные магические числа не являются опцией.Мы протестировали на iPhone и iPad и заметили различные значения по умолчанию для врезок даже на одном и том же устройстве с разной версией iOS.Я также был бы рад советам и решениям для объективов C и Swift, если они работают в xamarin после правильного перевода.

1 Ответ

0 голосов
/ 31 мая 2018

Если вы хотите использовать поля по умолчанию в зависимости от разных устройств или разных версий, почему бы не попробовать автоматическое расположение?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, ячейкаавтоматически вычислит высоту строки в зависимости от ее содержимого, если мы установим правильные ограничения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...