diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/LabelFormattedTextHtmlPadding.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/LabelFormattedTextHtmlPadding.cs new file mode 100644 index 00000000000..99a82dadae8 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/LabelFormattedTextHtmlPadding.cs @@ -0,0 +1,46 @@ +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + +#if UITEST +using Xamarin.Forms.Core.UITests; +using Xamarin.UITest; +using NUnit.Framework; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ +#if UITEST + [Category(UITestCategories.ManualReview)] +#endif + [Preserve(AllMembers = true)] + [Issue(IssueTracker.None, 0, "Label with FormattedText, HTML, and Padding shouldn't cause crash", PlatformAffected.iOS)] + public class LabelFormattedTextHtmlPadding : TestContentPage + { + protected override void Init() + { + var formattedString = new FormattedString(); + formattedString.Spans.Add(new Span { Text = "This test passes if app doesn't crash. Label is not expected to actually work" }); + + Content = new StackLayout() + { + Margin = 20, + + Children = + { + new Label() + { + AutomationId = "LabelFormattedTextHtmlPaddingTest", + Text = "If you can see this text, this test has passed" + }, + new Label() + { + AutomationId = "LabelFormattedTextHtmlPadding", + FormattedText = formattedString, + TextType = TextType.Html, + Padding = 5 + } + } + }; + } + } +} \ 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 53b67b1114b..d13c936984d 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 @@ -1705,6 +1705,7 @@ + diff --git a/Xamarin.Forms.Platform.iOS.UnitTests/HtmlLabelTests.cs b/Xamarin.Forms.Platform.iOS.UnitTests/HtmlLabelTests.cs index 1a346b1a322..d43a72534d6 100644 --- a/Xamarin.Forms.Platform.iOS.UnitTests/HtmlLabelTests.cs +++ b/Xamarin.Forms.Platform.iOS.UnitTests/HtmlLabelTests.cs @@ -82,5 +82,30 @@ public async Task LabelFontDefaultDefersToHtml() Assert.That(actualFont.PointSize, Is.EqualTo(expectedFontSize)); } + + [Test, Category("Label"), Category("FormattedText")] + [Description("If Label has FormattedText, HTML, and Padding, app should not crash")] + public async Task LabelWithFormattedTextHTMLAndPaddingDoesNotCrashApp() + { + var formattedString = new FormattedString(); + formattedString.Spans.Add(new Span { Text = "Label with FormattedText, HTML, and Padding" }); + var label = new Label + { + FormattedText = formattedString, + TextType = TextType.Html, + Padding = 5 + }; + + var expected = TextType.Html; + var actual = await GetRendererProperty(label, renderer => + { + var uiLabel = (UILabel)(renderer as LabelRenderer).Control; + uiLabel.Frame = new CoreGraphics.CGRect(0, 0, 200, 200); + uiLabel.RecalculateSpanPositions(label); + return label.TextType; + }, true); + + Assert.That(actual, Is.EqualTo(expected)); + } } } \ No newline at end of file diff --git a/Xamarin.Forms.Platform.iOS/Extensions/LabelExtensions.cs b/Xamarin.Forms.Platform.iOS/Extensions/LabelExtensions.cs index ab1f25f931b..185edc06610 100644 --- a/Xamarin.Forms.Platform.iOS/Extensions/LabelExtensions.cs +++ b/Xamarin.Forms.Platform.iOS/Extensions/LabelExtensions.cs @@ -21,6 +21,12 @@ internal static class LabelExtensions { public static void RecalculateSpanPositions(this NativeLabel control, Label element) { + if (element == null) + return; + + if (element.TextType == TextType.Html) + return; + if (element?.FormattedText?.Spans == null || element.FormattedText.Spans.Count == 0) return;