Skip to content

Commit 3859318

Browse files
hartezrmarinhoGitHub Actions Autoformatter
authored
Make sure that we have valid values for setting the ContentSize of the ScrollView on iOS (#14176)
* [iOS] Don't set constrains for orientation if they are 0 * Simplify the ContentSize/Orientation stuff a bit and add comments * Auto-format source code --------- Co-authored-by: Rui Marinho <[email protected]> Co-authored-by: GitHub Actions Autoformatter <[email protected]>
1 parent bd22db7 commit 3859318

File tree

1 file changed

+23
-22
lines changed

1 file changed

+23
-22
lines changed

src/Core/src/Handlers/ScrollView/ScrollViewHandler.iOS.cs

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -93,9 +93,12 @@ public static void MapVerticalScrollBarVisibility(IScrollViewHandler handler, IS
9393

9494
public static void MapOrientation(IScrollViewHandler handler, IScrollView scrollView)
9595
{
96-
if (GetContentView(handler.PlatformView) is ContentView currentContentContainer)
96+
if (handler?.PlatformView is UIScrollView uiScrollView)
9797
{
98-
currentContentContainer.SetNeedsLayout();
98+
var fullContentSize = scrollView.PresentedContent?.DesiredSize ?? Size.Zero;
99+
var viewportWidth = uiScrollView.Bounds.Width;
100+
var viewportHeight = uiScrollView.Bounds.Height;
101+
SetContentSizeForOrientation(uiScrollView, viewportWidth, viewportHeight, scrollView.Orientation, fullContentSize);
99102
}
100103
}
101104

@@ -198,9 +201,12 @@ static Func<Rect, Size> ArrangeScrollViewContent(Func<Rect, Size> internalArrang
198201
Math.Max(containerBounds.Height, scrollViewBounds.Height));
199202
container.Center = new CGPoint(container.Bounds.GetMidX(), container.Bounds.GetMidY());
200203
}
204+
201205
var contentSize = internalArrange(rect);
202-
var size = SetContentSizeForOrientation(platformScrollView, scrollView.Orientation, contentSize);
203-
return size;
206+
207+
SetContentSizeForOrientation(platformScrollView, platformScrollView.Bounds.Width, platformScrollView.Bounds.Height, scrollView.Orientation, contentSize);
208+
209+
return contentSize;
204210
};
205211
}
206212

@@ -258,16 +264,19 @@ public override Size GetDesiredSize(double widthConstraint, double heightConstra
258264
widthConstraint = AccountForPadding(widthConstraint, padding.HorizontalThickness);
259265
heightConstraint = AccountForPadding(heightConstraint, padding.VerticalThickness);
260266

261-
var crossPlatformSize = virtualView.CrossPlatformMeasure(widthConstraint, heightConstraint);
267+
var crossPlatformContentSize = virtualView.CrossPlatformMeasure(widthConstraint, heightConstraint);
262268

263269
// Add the padding back in for the final size
264-
crossPlatformSize.Width += padding.HorizontalThickness;
265-
crossPlatformSize.Height += padding.VerticalThickness;
270+
crossPlatformContentSize.Width += padding.HorizontalThickness;
271+
crossPlatformContentSize.Height += padding.VerticalThickness;
272+
273+
var viewportWidth = Math.Min(crossPlatformContentSize.Width, widthConstraint);
274+
var viewportHeight = Math.Min(crossPlatformContentSize.Height, heightConstraint);
266275

267-
var size = SetContentSizeForOrientation(platformView, virtualView.Orientation, crossPlatformSize);
276+
SetContentSizeForOrientation(platformView, widthConstraint, heightConstraint, virtualView.Orientation, crossPlatformContentSize);
268277

269-
var finalWidth = ViewHandlerExtensions.ResolveConstraints(size.Width, virtualView.Width, virtualView.MinimumWidth, virtualView.MaximumWidth);
270-
var finalHeight = ViewHandlerExtensions.ResolveConstraints(size.Height, virtualView.Height, virtualView.MinimumHeight, virtualView.MaximumHeight);
278+
var finalWidth = ViewHandlerExtensions.ResolveConstraints(viewportWidth, virtualView.Width, virtualView.MinimumWidth, virtualView.MaximumWidth);
279+
var finalHeight = ViewHandlerExtensions.ResolveConstraints(viewportHeight, virtualView.Height, virtualView.MinimumHeight, virtualView.MaximumHeight);
271280

272281
return new Size(finalWidth, finalHeight);
273282
}
@@ -304,27 +313,19 @@ static double AccountForPadding(double constraint, double padding)
304313
return Math.Max(0, constraint - padding);
305314
}
306315

307-
static Size SetContentSizeForOrientation(UIScrollView platformScrollView, ScrollOrientation orientation, Size crossPlatformSize)
308-
{
309-
CGRect scrollViewBounds = platformScrollView.Bounds;
310-
var contentSize = AccountForOrientation(crossPlatformSize, scrollViewBounds.Width, scrollViewBounds.Height, orientation);
311-
platformScrollView.ContentSize = contentSize;
312-
return contentSize;
313-
}
314-
315-
internal static Size AccountForOrientation(Size size, double widthConstraint, double heightConstraint, ScrollOrientation orientation)
316+
static void SetContentSizeForOrientation(UIScrollView uiScrollView, double viewportWidth, double viewportHeight, ScrollOrientation orientation, Size contentSize)
316317
{
317318
if (orientation is ScrollOrientation.Vertical or ScrollOrientation.Neither)
318319
{
319-
size.Width = widthConstraint;
320+
contentSize.Width = Math.Min(contentSize.Width, viewportWidth);
320321
}
321322

322323
if (orientation is ScrollOrientation.Horizontal or ScrollOrientation.Neither)
323324
{
324-
size.Height = heightConstraint;
325+
contentSize.Height = Math.Min(contentSize.Height, viewportHeight);
325326
}
326327

327-
return size;
328+
uiScrollView.ContentSize = contentSize;
328329
}
329330
}
330331
}

0 commit comments

Comments
 (0)