diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla53362.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla53362.cs
new file mode 100644
index 00000000000..1073c0f3833
--- /dev/null
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla53362.cs
@@ -0,0 +1,35 @@
+using Xamarin.Forms.CustomAttributes;
+using Xamarin.Forms.Internals;
+
+namespace Xamarin.Forms.Controls.Issues
+{
+ [Preserve(AllMembers = true)]
+ [Issue(IssueTracker.Bugzilla, 53362, "Layout regression in Grid on iOS: HorizontalOption = Center does not center", PlatformAffected.iOS)]
+ public class Bugzilla53362 : TestContentPage
+ {
+ protected override void Init()
+ {
+ var label1 = new Label { Text = "auto sized row", TextColor = Color.Silver, HorizontalOptions = LayoutOptions.Center, BackgroundColor = Color.Purple };
+ var label2 = new Label { Text = "row size 20", TextColor = Color.Silver, HorizontalOptions = LayoutOptions.Center, BackgroundColor = Color.Purple };
+ var label3 = new Label { Text = "row size 25", TextColor = Color.Silver, HorizontalOptions = LayoutOptions.Center, BackgroundColor = Color.Purple };
+
+ var grid = new Grid
+ {
+ RowDefinitions =
+ {
+ new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) },
+ new RowDefinition { Height = new GridLength(20, GridUnitType.Absolute) },
+ new RowDefinition { Height = new GridLength(25, GridUnitType.Absolute) },
+ new RowDefinition { Height = new GridLength(1, GridUnitType.Auto) },
+ }
+ };
+
+ grid.Children.Add(label1, 0, 0);
+ grid.Children.Add(label2, 0, 1);
+ grid.Children.Add(label3, 0, 2);
+ grid.Children.Add(new Label { Text = "If the three labels above are not all centered horizontally, this test has failed." }, 0, 3);
+
+ Content = grid;
+ }
+ }
+}
\ No newline at end of file
diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
index d8b688dda73..df9f7079d8a 100644
--- a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
+++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
@@ -260,6 +260,7 @@
+
diff --git a/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs b/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
index 5101b167a8a..1a4b0931657 100644
--- a/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
+++ b/Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
@@ -72,15 +72,31 @@ public override SizeRequest GetDesiredSize(double widthConstraint, double height
_perfectSizeValid = true;
}
- if (widthConstraint >= _perfectSize.Request.Width && heightConstraint >= _perfectSize.Request.Height)
+ var widthFits = widthConstraint >= _perfectSize.Request.Width;
+ var heightFits = heightConstraint >= _perfectSize.Request.Height;
+
+ if (widthFits && heightFits)
return _perfectSize;
var result = base.GetDesiredSize(widthConstraint, heightConstraint);
- result.Minimum = new Size(Math.Min(10, result.Request.Width), result.Request.Height);
- if (Element.LineBreakMode != LineBreakMode.NoWrap)
+ var tinyWidth = Math.Min(10, result.Request.Width);
+ result.Minimum = new Size(tinyWidth, result.Request.Height);
+
+ if (widthFits || Element.LineBreakMode == LineBreakMode.NoWrap)
+ return result;
+
+ bool containerIsNotInfinitelyWide = !double.IsInfinity(widthConstraint);
+
+ if (containerIsNotInfinitelyWide)
{
- if (result.Request.Width > widthConstraint || Element.LineBreakMode == LineBreakMode.WordWrap || Element.LineBreakMode == LineBreakMode.CharacterWrap)
- result.Request = new Size(Math.Max(result.Minimum.Width, widthConstraint), result.Request.Height);
+ bool textCouldHaveWrapped = Element.LineBreakMode == LineBreakMode.WordWrap || Element.LineBreakMode == LineBreakMode.CharacterWrap;
+ bool textExceedsContainer = result.Request.Width > widthConstraint;
+
+ if (textExceedsContainer || textCouldHaveWrapped)
+ {
+ var expandedWidth = Math.Max(tinyWidth, widthConstraint);
+ result.Request = new Size(expandedWidth, result.Request.Height);
+ }
}
return result;
diff --git a/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs
index b8b81e99881..82ceda813a5 100644
--- a/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs
+++ b/Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs
@@ -30,16 +30,31 @@ public override SizeRequest GetDesiredSize(double widthConstraint, double height
_perfectSizeValid = true;
}
- if (widthConstraint >= _perfectSize.Request.Width && heightConstraint >= _perfectSize.Request.Height)
+ var widthFits = widthConstraint >= _perfectSize.Request.Width;
+ var heightFits = heightConstraint >= _perfectSize.Request.Height;
+
+ if (widthFits && heightFits)
return _perfectSize;
var result = base.GetDesiredSize(widthConstraint, heightConstraint);
- result.Minimum = new Size(Math.Min(10, result.Request.Width), result.Request.Height);
- if (Element.LineBreakMode != LineBreakMode.NoWrap)
+ var tinyWidth = Math.Min(10, result.Request.Width);
+ result.Minimum = new Size(tinyWidth, result.Request.Height);
+
+ if (widthFits || Element.LineBreakMode == LineBreakMode.NoWrap)
+ return result;
+
+ bool containerIsNotInfinitelyWide = !double.IsInfinity(widthConstraint);
+
+ if (containerIsNotInfinitelyWide)
{
- if (!double.IsInfinity(result.Request.Width) && !double.IsInfinity(widthConstraint))
- if (result.Request.Width > widthConstraint || Element.LineBreakMode == LineBreakMode.WordWrap || Element.LineBreakMode == LineBreakMode.CharacterWrap)
- result.Request = new Size(Math.Max(result.Minimum.Width, widthConstraint), result.Request.Height);
+ bool textCouldHaveWrapped = Element.LineBreakMode == LineBreakMode.WordWrap || Element.LineBreakMode == LineBreakMode.CharacterWrap;
+ bool textExceedsContainer = result.Request.Width > widthConstraint;
+
+ if (textExceedsContainer || textCouldHaveWrapped)
+ {
+ var expandedWidth = Math.Max(tinyWidth, widthConstraint);
+ result.Request = new Size(expandedWidth, result.Request.Height);
+ }
}
return result;