diff --git a/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue14397.cs b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue14397.cs new file mode 100644 index 00000000000..859cb06c416 --- /dev/null +++ b/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issues.Shared/Issue14397.cs @@ -0,0 +1,64 @@ +using Xamarin.Forms.CustomAttributes; +using Xamarin.Forms.Internals; + + +#if UITEST +using Xamarin.UITest; +using NUnit.Framework; +using Xamarin.Forms.Core.UITests; +#endif + +namespace Xamarin.Forms.Controls.Issues +{ + [Preserve(AllMembers = true)] + [Issue(IssueTracker.Github, 14397, "[Bug] iOS Background appears in front of image", + PlatformAffected.iOS)] +#if UITEST + [NUnit.Framework.Category(UITestCategories.Image)] +#endif + public class Issue14397 : TestContentPage + { + public Issue14397() + { + Title = "Issue 14397"; + + var layout = new StackLayout(); + + var instructions = new Label + { + Padding = 12, + Text = "If can see the icon with the gradient background, the test has passed." + }; + + var image = new Image + { + HorizontalOptions = LayoutOptions.Start, + HeightRequest = 100, + WidthRequest = 100, + Source = "coffee.png", + Margin = new Thickness(12, 0) + }; + + image.Background = new LinearGradientBrush + { + StartPoint = new Point(0, 0), + EndPoint = new Point(1, 0), + GradientStops = new GradientStopCollection + { + new GradientStop { Color = Color.OrangeRed, Offset = 0.0f }, + new GradientStop { Color = Color.PaleVioletRed, Offset = 0.9f }, + } + }; + + layout.Children.Add(instructions); + layout.Children.Add(image); + + Content = layout; + } + + protected override void Init() + { + + } + } +} \ 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 cc62cfd74d4..5ea66557e50 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 @@ -1827,6 +1827,7 @@ + diff --git a/Xamarin.Forms.Platform.iOS/Renderers/ImageRenderer.cs b/Xamarin.Forms.Platform.iOS/Renderers/ImageRenderer.cs index 557b1584231..4f76b51a638 100644 --- a/Xamarin.Forms.Platform.iOS/Renderers/ImageRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/Renderers/ImageRenderer.cs @@ -1,5 +1,4 @@ using System; -using System.Drawing; using System.ComponentModel; using System.IO; using System.Threading; @@ -72,6 +71,7 @@ protected override async void OnElementChanged(ElementChangedEventArgs e) } await TrySetImage(e.OldElement as Image); + UpdateBackground(); } base.OnElementChanged(e); @@ -83,6 +83,8 @@ protected override async void OnElementPropertyChanged(object sender, PropertyCh if (e.PropertyName == Image.SourceProperty.PropertyName) await TrySetImage().ConfigureAwait(false); + else if (e.PropertyName == VisualElement.BackgroundProperty.PropertyName) + UpdateBackground(); } protected virtual async Task TrySetImage(Image previous = null) @@ -115,8 +117,17 @@ protected async Task SetImage(Image oldElement = null) bool IImageVisualElementRenderer.IsDisposed => _isDisposed; UIImageView IImageVisualElementRenderer.GetImage() => Control; - } + void UpdateBackground() + { + var parent = Control.Superview; + + if (parent == null) + return; + + parent.UpdateBackground(Element.Background); + } + } public interface IImageSourceHandler : IRegisterable { diff --git a/Xamarin.Forms.Platform.iOS/ViewRenderer.cs b/Xamarin.Forms.Platform.iOS/ViewRenderer.cs index 0fe78f9b247..91e92d37411 100644 --- a/Xamarin.Forms.Platform.iOS/ViewRenderer.cs +++ b/Xamarin.Forms.Platform.iOS/ViewRenderer.cs @@ -215,6 +215,10 @@ protected override void SetBackground(Brush brush) if (IsElementOrControlEmpty) return; + // Updated in the ImageRenderer + if (Element is Image) + return; + Control.UpdateBackground(brush); }