/*
First tip: Get rid of this function...
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)
It only saves a few keystrokes, and causes problems if/when we need change constraints (the Constant, Priority, Activate/Deactivate, etc).
A better approach than adding a "Container" view and setting constraints on individual CardViews would be to use a Stack View.
In plain language...
1. Add scrollview to VC view
2. constrain all 4 sides to safe area
3. add a UIStackView to scroll view
4. constrain all 4 sides to scrollView.contentLayoutGuide (10-pts padding)
5. constrain stack view width to scrollView.frameLayoutGuide.widthAnchor -20 (10-pts on each side
6. create CardViews and add as arranged subviews of stackView
- on pull-to-refresh, either
- update the content of the current CardViews
- or
- remove each cardView from superView, and re-add new ones
So, if I understand the Xamarin / C# syntax correctly (there may be an error or two in here):
*/
public override void ViewDidLoad()
{
base.ViewDidLoad();
_scrollView = new UIScrollView
{
ShowsHorizontalScrollIndicator = false,
TranslatesAutoresizingMaskIntoConstraints = false
};
if (!UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
{
_scrollView.AlwaysBounceVertical = true;
_scrollView.Bounces = true;
}
_refreshControl = new UIRefreshControl { TranslatesAutoresizingMaskIntoConstraints = false };
_refreshControl.Enabled = true;
_refreshControl.ValueChanged -= RefreshControl_ValueChanged;
_refreshControl.ValueChanged += RefreshControl_ValueChanged;
if (UIDevice.CurrentDevice.CheckSystemVersion(10, 0))
{
_scrollView.RefreshControl = _refreshControl;
}
else
{
_scrollView.AddSubview(_refreshControl);
}
// 1. Add scrollview to VC view
this.View.AddSubview(_scrollView);
// 2. constrain all 4 sides to safe area
_scrollView.TopAnchor.ConstraintEqualTo(this.View.SaferAreaLayoutGuide().TopAnchor, 0f).Active = true;
_scrollView.LeadingAnchor.ConstraintEqualTo(this.View.SaferAreaLayoutGuide().LeadingAnchor, 0f).Active = true;
_scrollView.TrailingAnchor.ConstraintEqualTo(this.View.SaferAreaLayoutGuide().TrailingAnchor, 0f).Active = true;
_scrollView.BottomAnchor.ConstraintEqualTo(this.View.SaferAreaLayoutGuide().BottomAnchor, 0f).Active = true;
// 3. add a UIStackView to scroll view
_stackView = new UIStackView {
TranslatesAutoresizingMaskIntoConstraints = false
Axis = UILayoutConstraintAxis.Vertical
Distribution = UIStackViewDistribution.Fill
Spacing = 10f
};
_scrollView.AddSubview(_stackView);
// 4. constrain all 4 sides to scrollView.contentLayoutGuide (10-pts padding)
_stackView.TopAnchor.ConstraintEqualTo(_scrollView.ContentLayoutGuide.TopAnchor, 10f).Active = true;
_stackView.LeadingAnchor.ConstraintEqualTo(_scrollView.ContentLayoutGuide.LeadingAnchor, 10f).Active = true;
_stackView.TrailingAnchor.ConstraintEqualTo(_scrollView.ContentLayoutGuide.TrailingAnchor, -10f).Active = true;
_stackView.BottomAnchor.ConstraintEqualTo(_scrollView.ContentLayoutGuide.BottomAnchor, -10f).Active = true;
// 5. constrain stack view width to scrollView.frameLayoutGuide.widthAnchor -20 (10-pts on each side
_stackView.WidthAnchor.ConstraintEqualTo(_scrollView.FrameLayoutGuide.WidthAnchor, -20f).Active = true;
// NO Height constraint for stackView
// 6. create CardViews and add as arranged subviews of stackView
CardView qolCard = new CardView();
_stackView.AddArrangedSubview(qolCard);
qolCard.TranslatesAutoresizingMaskIntoConstraints = false;
qolCard.CornerRadius = 5f;
qolCard.ShadowOffsetHeight = 0;
qolCard.ShadowOffsetWidth = 0;
qolCard.BackgroundColor = UIColor.White;
CardView goalsCard = new CardView();
_stackView.AddArrangedSubview(goalsCard);
goalsCard.TranslatesAutoresizingMaskIntoConstraints = false;
goalsCard.CornerRadius = 5f;
goalsCard.ShadowOffsetHeight = 0;
goalsCard.ShadowOffsetWidth = 0;
goalsCard.BackgroundColor = UIColor.White;
}
Comments
0 B
|👍
/👎