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));
            }
        }
Exemple #3
0
        /// <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);
        }
Exemple #4
0
 public static IEnumerable <FluentLayout> VerticalStackPanelConstraints(this UIView parentView, Margins margins, params UIView[] views) =>
 AdvancedVerticalStackPanelConstraints(parentView, margins, views: views);
Exemple #5
0
        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")
            });
        }