[iOS/Win] Label will not unnecessarily expand (#827)
authorSamantha Houts <samantha@teamredwall.com>
Wed, 22 Mar 2017 10:43:17 +0000 (03:43 -0700)
committerRui Marinho <me@ruimarinho.net>
Wed, 22 Mar 2017 10:43:17 +0000 (10:43 +0000)
* Add repro for 53362

* [iOS] Label will not unnecessarily expand

* [Win] Label will not unnecessarily expand

Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Bugzilla53362.cs [new file with mode: 0644]
Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Xamarin.Forms.Controls.Issues.Shared.projitems
Xamarin.Forms.Platform.WinRT/LabelRenderer.cs
Xamarin.Forms.Platform.iOS/Renderers/LabelRenderer.cs

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 (file)
index 0000000..1073c0f
--- /dev/null
@@ -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
index 1b060ef..326d132 100644 (file)
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla51503.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla51505.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Bugzilla52533.cs" />
+    <Compile Include="$(MSBuildThisFileDirectory)Bugzilla53362.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)_Template.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue1028.cs" />
     <Compile Include="$(MSBuildThisFileDirectory)Issue1075.cs" />
index 5101b16..1a4b093 100644 (file)
@@ -72,15 +72,31 @@ namespace Xamarin.Forms.Platform.WinRT
                                _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;
index b8b81e9..82ceda8 100644 (file)
@@ -30,16 +30,31 @@ namespace Xamarin.Forms.Platform.MacOS
                                _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;