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;