Програматически сделать высоту UIView обернуть его содержимое? - PullRequest
0 голосов
/ 30 марта 2020

Я создаю карту и хотел бы, чтобы ее высота автоматически подстраивалась под ее содержимое. Я использую Auto Layout, и каждый элемент внутри карты ограничен предыдущим.

  • Заголовок - UIStackView.
  • Датчик - это сторонний элемент управления.
  • Существует до 5 групп по 3 UILabels.
  • Наконец, есть кнопка UIB.

enter image description here

Я не уверен, что могу установить ограничение между кнопкой и ее родителем.

Было бы неплохо что-то похожее на WrapContent для Android.

код для CarView - здесь .

Может быть, я мог бы переопределить свойство IntrinsicContentSize и вернуть фактический размер всех детей?

Я пытался добавить этот код:

public override CGSize IntrinsicContentSize
{
    get
    {
        nfloat finalHeight = 0;
        foreach (UIView uIView in base.Subviews)
        {
            finalHeight += uIView.Frame.Height;
        }
        return new CGSize(this.Frame.Width, finalHeight);
    }
}

На самом деле это называется очень рано, и у меня еще нет подписки.

Карта создана следующим образом (Прямо сейчас размер карты фиксирован):

CardView qolCard = new CardView();
View.AddSubview(qolCard);
qolCard.TranslatesAutoresizingMaskIntoConstraints = false;
qolCard.CornerRadius = 5f;
qolCard.ShadowOffsetHeight = 0;
qolCard.ShadowOffsetWidth = 0;
qolCard.BackgroundColor = UIColor.White;
qolCard.Anchor(leading: View.LeadingAnchor, trailing: View.TrailingAnchor, top: View.SafeAreaLayoutGuide.TopAnchor, size: new CGSize(0f, 400f), padding: new UIEdgeInsets(10f, 10f, 10f, 10f));

Метод Anchor helper заключается в следующем:

internal static void Anchor(this UIView uIView, NSLayoutYAxisAnchor top = null, NSLayoutXAxisAnchor leading = null, NSLayoutYAxisAnchor bottom = null, NSLayoutXAxisAnchor trailing = null, UIEdgeInsets padding = default, CGSize size = default)
{
    uIView.TranslatesAutoresizingMaskIntoConstraints = false;
    if (top != null)
    {
        uIView.TopAnchor.ConstraintEqualTo(top, padding.Top).Active = true;
    }

    if (leading != null)
    {
        uIView.LeadingAnchor.ConstraintEqualTo(leading, padding.Left).Active = true;
    }

    if (bottom != null)
    {
        uIView.BottomAnchor.ConstraintEqualTo(bottom, -padding.Bottom).Active = true;
    }

    if (trailing != null)
    {
        uIView.TrailingAnchor.ConstraintEqualTo(trailing, -padding.Right).Active = true;
    }

    if (size.Width != 0)
    {
        uIView.WidthAnchor.ConstraintEqualTo(size.Width).Active = true;
    }

    if (size.Height != 0)
    {
        uIView.HeightAnchor.ConstraintEqualTo(size.Height).Active = true;
    }
}

Любая помощь приветствуется.


РЕДАКТИРОВАТЬ: С этими простыми модификациями по Джеку Хуа:

    qolCard.Anchor(leading: View.LeadingAnchor, trailing: View.TrailingAnchor, top: View.SafeAreaLayoutGuide.TopAnchor, bottom: rateButton.BottomAnchor, padding: new UIEdgeInsets(10f, 10f, 10f, 10f));

Это дает мне следующий результат, который не идеален, но близок к тому, что я хочу:

enter image description here

Я удивлен, что смог привязать родительское представление к дочернему. Или я мог?

...