Я создаю карту и хотел бы, чтобы ее высота автоматически подстраивалась под ее содержимое. Я использую Auto Layout, и каждый элемент внутри карты ограничен предыдущим.
- Заголовок - UIStackView.
- Датчик - это сторонний элемент управления.
- Существует до 5 групп по 3 UILabels.
- Наконец, есть кнопка UIB.
Я не уверен, что могу установить ограничение между кнопкой и ее родителем.
Было бы неплохо что-то похожее на 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));
Это дает мне следующий результат, который не идеален, но близок к тому, что я хочу:
Я удивлен, что смог привязать родительское представление к дочернему. Или я мог?