public static IEnumerable<FluentLayout> VerticalStackPanelConstraints(this UIView parentView, Margins margins, params UIView[] views) { margins = margins ?? new Margins(); UIView previous = null; foreach (var view in views) { yield return view.Left() .EqualTo() .LeftOf(parentView) .Plus(margins.Left); yield return view.Width() .EqualTo() .WidthOf(parentView) .Minus(margins.Right + margins.Left); if (previous != null) yield return view.Top() .EqualTo() .BottomOf(previous) .Plus(margins.Top); else yield return view.Top() .EqualTo() .TopOf(parentView) .Plus(margins.Top); previous = view; } if (parentView is UIScrollView) yield return previous .Bottom() .EqualTo() .BottomOf(parentView) .Minus(margins.Bottom); }
public static IEnumerable <FluentLayout> VerticalStackPanelConstraints(this UIView parentView, Margins margins, params UIView[] views) { margins = margins ?? new Margins(); UIView previous = null; foreach (var view in views) { yield return(view.Left().EqualTo().LeftOf(parentView).Plus(margins.Left)); yield return(view.Width().EqualTo().WidthOf(parentView).Minus(margins.Right + margins.Left)); if (previous != null) { yield return(view.Top().EqualTo().BottomOf(previous).Plus(margins.VSpacing)); } else { yield return(view.Top().EqualTo().TopOf(parentView).Plus(margins.Top)); } previous = view; } if (parentView is UIScrollView) { yield return(previous.Bottom().EqualTo().BottomOf(parentView).Minus(margins.Bottom)); } }
/// <summary> /// Vertical stack panel constraints with support for children independent left, right and top margins /// and a multiplier factor for all margins applied. The multiplier can be useful when dealing with iPad screens. /// Example: /// /// scrollView.AddConstraints(scrollView.AdvancedVerticalStackPanelConstraints(null, /// childrenLeftMargins: new float[] { 15, 0, 15, 0, 0, 15 }, /// childrenTopMargins: new float[] { 15, 5, 15, 5, 8, 15, 22, 8, 8, 28, 28 }, /// marginMultiplier: 2f, /// views: scrollView.Subviews) /// ); /// </summary> public static IEnumerable <FluentLayout> AdvancedVerticalStackPanelConstraints(this UIView parentView, Margins margins, float[] childrenLeftMargins = null, float[] childrenTopMargins = null, float[] childrenRightMargins = null, float marginMultiplier = 1, params UIView[] views) { string previousIdentifierPrefix = null; margins = margins ?? new Margins(); var layouts = new List <FluentLayout>(); var count = views.Length; for (var i = 0; i < count; i++) { var view = views[i]; var viewIdentifierPrefix = $"{parentView.AccessibilityIdentifier ?? "VerticalStackPanel"}-{view.AccessibilityIdentifier ?? i.ToString()}-"; float childLeftMargin; childrenLeftMargins.TryGetElement(i, out childLeftMargin); var marginLeft = Math.Max(margins.Left, childLeftMargin) * marginMultiplier; layouts.Add(view.Left() .EqualTo() .LeftOf(parentView) .Plus(marginLeft) .WithIdentifier(viewIdentifierPrefix + "Left")); float childRightMargin; childrenRightMargins.TryGetElement(i, out childRightMargin); var marginRight = Math.Max(margins.Right, childRightMargin) * marginMultiplier; layouts.Add(view.Width() .EqualTo() .WidthOf(parentView) .Minus(marginRight + marginLeft) .WithIdentifier(viewIdentifierPrefix + "Width")); float childTopMargin; childrenTopMargins.TryGetElement(i, out childTopMargin); layouts.Add(i == 0 ? view.Top() .EqualTo() .TopOf(parentView) .Plus(Math.Max(margins.Top, childTopMargin) * marginMultiplier) .WithIdentifier(viewIdentifierPrefix + "Top") : view.Top() .EqualTo() .BottomOf(views[i - 1]) .Plus(Math.Max(margins.VSpacing, childTopMargin) * marginMultiplier) .WithIdentifier(viewIdentifierPrefix + "Top")); previousIdentifierPrefix = viewIdentifierPrefix; } if (parentView is UIScrollView) { layouts.Add(views[views.Length - 1].Bottom() .EqualTo() .BottomOf(parentView) .Minus(margins.Bottom * marginMultiplier) .WithIdentifier(previousIdentifierPrefix + "Bottom")); } return(layouts); }
public static IEnumerable <FluentLayout> VerticalStackPanelConstraints(this UIView parentView, Margins margins, params UIView[] views) => AdvancedVerticalStackPanelConstraints(parentView, margins, views: views);
public static IEnumerable <FluentLayout> FullSizeOf(this UIView view, UIView parent, Margins margins) { margins = margins ?? new Margins(); return(new List <FluentLayout> { view.AtTopOf(parent, margins.Top).WithIdentifier("Top"), view.AtBottomOf(parent, margins.Bottom).WithIdentifier("Bottom"), view.AtLeftOf(parent, margins.Left).WithIdentifier("Left"), view.AtRightOf(parent, margins.Right).WithIdentifier("Right") }); }