Skip to content

Commit e44c057

Browse files
committed
ScrollView CrossPlatformMeasure - refactor
1 parent 2478901 commit e44c057

File tree

4 files changed

+49
-53
lines changed

4 files changed

+49
-53
lines changed

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

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,10 @@ static void InsertInsetView(IScrollViewHandler handler, IScrollView scrollView,
219219

220220
Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double heightConstraint)
221221
{
222-
var scrollView = VirtualView;
222+
if (VirtualView is not { } scrollView)
223+
{
224+
return Size.Zero;
225+
}
223226

224227
var padding = scrollView.Padding;
225228

@@ -228,26 +231,22 @@ Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double he
228231
return new Size(padding.HorizontalThickness, padding.VerticalThickness);
229232
}
230233

231-
// Exclude the padding while measuring the internal content ...
232-
var measurementWidth = widthConstraint - padding.HorizontalThickness;
233-
var measurementHeight = heightConstraint - padding.VerticalThickness;
234-
235-
var result = (scrollView as ICrossPlatformLayout).CrossPlatformMeasure(measurementWidth, measurementHeight);
236-
237-
// ... and add the padding back in to the final result
238-
var fullSize = new Size(result.Width + padding.HorizontalThickness, result.Height + padding.VerticalThickness);
234+
var scrollOrientation = scrollView.Orientation;
235+
var contentWidthConstraint = scrollOrientation is ScrollOrientation.Horizontal or ScrollOrientation.Both ? double.PositiveInfinity : widthConstraint;
236+
var contentHeightConstraint = scrollOrientation is ScrollOrientation.Vertical or ScrollOrientation.Both ? double.PositiveInfinity : heightConstraint;
237+
var contentSize = scrollView.MeasureContent(scrollView.Padding, contentWidthConstraint, contentHeightConstraint, !double.IsInfinity(contentWidthConstraint), !double.IsInfinity(contentHeightConstraint));
239238

240239
if (double.IsInfinity(widthConstraint))
241240
{
242-
widthConstraint = result.Width;
241+
widthConstraint = contentSize.Width;
243242
}
244243

245244
if (double.IsInfinity(heightConstraint))
246245
{
247-
heightConstraint = result.Height;
246+
heightConstraint = contentSize.Height;
248247
}
249248

250-
return fullSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), scrollView.PresentedContent);
249+
return contentSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), scrollView.PresentedContent);
251250
}
252251

253252
Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds)

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

Lines changed: 12 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -164,37 +164,34 @@ static void InsertContentPanel(ScrollViewer scrollViewer, IScrollView scrollView
164164

165165
Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double heightConstraint)
166166
{
167-
var scrollView = VirtualView;
167+
if (VirtualView is not { } scrollView)
168+
{
169+
return Size.Zero;
170+
}
168171

169172
var padding = scrollView.Padding;
170-
var presentedContent = scrollView.PresentedContent;
171173

172-
if (presentedContent == null)
174+
if (scrollView.PresentedContent == null)
173175
{
174176
return new Size(padding.HorizontalThickness, padding.VerticalThickness);
175177
}
176178

177-
// Exclude the padding while measuring the internal content ...
178-
var measurementWidth = widthConstraint - padding.HorizontalThickness;
179-
var measurementHeight = heightConstraint - padding.VerticalThickness;
180-
181-
var result = (scrollView as ICrossPlatformLayout).CrossPlatformMeasure(measurementWidth, measurementHeight);
182-
183-
// ... and add the padding back in to the final result
184-
var fullSize = new Size(result.Width + padding.HorizontalThickness, result.Height + padding.VerticalThickness);
179+
var scrollOrientation = scrollView.Orientation;
180+
var contentWidthConstraint = scrollOrientation is ScrollOrientation.Horizontal or ScrollOrientation.Both ? double.PositiveInfinity : widthConstraint;
181+
var contentHeightConstraint = scrollOrientation is ScrollOrientation.Vertical or ScrollOrientation.Both ? double.PositiveInfinity : heightConstraint;
182+
var contentSize = scrollView.MeasureContent(scrollView.Padding, contentWidthConstraint, contentHeightConstraint, !double.IsInfinity(contentWidthConstraint), !double.IsInfinity(contentHeightConstraint));
185183

186184
if (double.IsInfinity(widthConstraint))
187185
{
188-
widthConstraint = result.Width;
186+
widthConstraint = contentSize.Width;
189187
}
190188

191189
if (double.IsInfinity(heightConstraint))
192190
{
193-
heightConstraint = result.Height;
191+
heightConstraint = contentSize.Height;
194192
}
195193

196-
// If the presented content has LayoutAlignment Fill, we'll need to adjust the measurement to account for that
197-
return fullSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), presentedContent);
194+
return contentSize.AdjustForFill(new Rect(0, 0, widthConstraint, heightConstraint), scrollView.PresentedContent);
198195
}
199196

200197
Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds)

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

Lines changed: 1 addition & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double he
154154
var scrollOrientation = scrollView.Orientation;
155155
var contentWidthConstraint = scrollOrientation is ScrollOrientation.Horizontal or ScrollOrientation.Both ? double.PositiveInfinity : widthConstraint;
156156
var contentHeightConstraint = scrollOrientation is ScrollOrientation.Vertical or ScrollOrientation.Both ? double.PositiveInfinity : heightConstraint;
157-
var contentSize = MeasureContent(scrollView, scrollView.Padding, contentWidthConstraint, contentHeightConstraint);
157+
var contentSize = scrollView.MeasureContent(scrollView.Padding, contentWidthConstraint, contentHeightConstraint, !double.IsInfinity(contentWidthConstraint), !double.IsInfinity(contentHeightConstraint));
158158

159159
// Our target size is the smaller of it and the constraints
160160
var width = contentSize.Width <= widthConstraint ? contentSize.Width : widthConstraint;
@@ -166,31 +166,6 @@ Size ICrossPlatformLayout.CrossPlatformMeasure(double widthConstraint, double he
166166
return new Size(width, height);
167167
}
168168

169-
static Size MeasureContent(IContentView contentView, Thickness inset, double widthConstraint, double heightConstraint)
170-
{
171-
var content = contentView.PresentedContent;
172-
173-
var contentSize = Size.Zero;
174-
175-
if (!double.IsInfinity(widthConstraint) && Dimension.IsExplicitSet(contentView.Width))
176-
{
177-
widthConstraint = contentView.Width;
178-
}
179-
180-
if (!double.IsInfinity(heightConstraint) && Dimension.IsExplicitSet(contentView.Height))
181-
{
182-
heightConstraint = contentView.Height;
183-
}
184-
185-
if (content is not null)
186-
{
187-
contentSize = content.Measure(widthConstraint - inset.HorizontalThickness,
188-
heightConstraint - inset.VerticalThickness);
189-
}
190-
191-
return new Size(contentSize.Width + inset.HorizontalThickness, contentSize.Height + inset.VerticalThickness);
192-
}
193-
194169
Size ICrossPlatformLayout.CrossPlatformArrange(Rect bounds)
195170
{
196171
return (VirtualView as ICrossPlatformLayout)?.CrossPlatformArrange(bounds) ?? Size.Zero;

src/Core/src/Layouts/LayoutExtensions.cs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,31 @@ public static Size MeasureContent(this IContentView contentView, Thickness inset
167167
return new Size(contentSize.Width + inset.HorizontalThickness, contentSize.Height + inset.VerticalThickness);
168168
}
169169

170+
internal static Size MeasureContent(this IContentView contentView, Thickness inset, double widthConstraint, double heightConstraint, bool constrainPresentedContentWidthToExplicitDimsOnContentView, bool constrainPresentedContentHeightToExplicitDimsOnContentView)
171+
{
172+
var content = contentView.PresentedContent;
173+
174+
if (Dimension.IsExplicitSet(contentView.Width) && constrainPresentedContentWidthToExplicitDimsOnContentView)
175+
{
176+
widthConstraint = contentView.Width;
177+
}
178+
179+
if (Dimension.IsExplicitSet(contentView.Height) && constrainPresentedContentHeightToExplicitDimsOnContentView)
180+
{
181+
heightConstraint = contentView.Height;
182+
}
183+
184+
var contentSize = Size.Zero;
185+
186+
if (content != null)
187+
{
188+
contentSize = content.Measure(widthConstraint - inset.HorizontalThickness,
189+
heightConstraint - inset.VerticalThickness);
190+
}
191+
192+
return new Size(contentSize.Width + inset.HorizontalThickness, contentSize.Height + inset.VerticalThickness);
193+
}
194+
170195
public static void ArrangeContent(this IContentView contentView, Rect bounds)
171196
{
172197
if (contentView.PresentedContent == null)

0 commit comments

Comments
 (0)