2017-08-15 5 views
0

Nous avons besoin d'un dégradé sur nos pages, nous utilisons donc SkiaSharp et un GradientView. Cela fonctionne très bien sur Android, mais ne fonctionne pas sur iOS - le dégradé ne s'affiche pas.Xamarin.Forms SkiaSharp Dégradé travaillant sur Android mais pas sur iOS

Devons-nous effectuer une initialisation spécifique à iOS pour SkiaSharp sur iOS, avec des moteurs de rendu ou du code dans AppDelegate?

Modifier Ceci fonctionne sur un iPad avec iOS 10.3.3. Notre XAML:

<?xml version="1.0" encoding="utf-8" ?> 
    <ContentView xmlns="http://xamarin.com/schemas/2014/forms" 
       xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml" 
       x:Class="MyProject.XForms.Controls.GradientView"> 
    </ContentView> 

Nos XAML.cs

using SkiaSharp; 
using SkiaSharp.Views.Forms; 
using Xamarin.Forms; 

namespace MyProject.XForms.Controls 
{ 
    public partial class GradientView : ContentView 
    { 
     public Color StartColor { get; set; } = Color.Transparent; 
     public Color EndColor { get; set; } = Color.Transparent; 
     public bool Horizontal { get; set; } = false; 

     public GradientView() 
     { 
      InitializeComponent(); 

      SKCanvasView canvasView = new SKCanvasView(); 
      canvasView.PaintSurface += OnCanvasViewPaintSurface; 
      Content = canvasView; 
     } 

     void OnCanvasViewPaintSurface(object sender, SKPaintSurfaceEventArgs args) 
     { 
      SKImageInfo info = args.Info; 
      SKSurface surface = args.Surface; 
      SKCanvas canvas = surface.Canvas; 

      canvas.Clear(); 

      var colors = new SKColor[] { StartColor.ToSKColor(), EndColor.ToSKColor() }; 
      SKPoint startPoint = new SKPoint(0, 0); 
      SKPoint endPoint = Horizontal ? new SKPoint(info.Width, 0) : new SKPoint(0, info.Height); 

      var shader = SKShader.CreateLinearGradient(startPoint, endPoint, colors, null, SKShaderTileMode.Clamp); 

      SKPaint paint = new SKPaint 
      { 
       Style = SKPaintStyle.Fill, 
       Shader = shader 
      }; 

      canvas.DrawRect(new SKRect(0, 0, info.Width, info.Height), paint); 
     } 
    } 
} 

Répondre

0

Peut-être que vous n'avez pas installé les nugets (à la fois SkiaSharp et SkiaSharp.Views.Forms) dans le projet iOS?

J'ai copié-collé votre code dans une nouvelle application, et cela a fonctionné la première fois.

D'autres choses qui peuvent être le problème est que la vue hauteur/largeur est 0. Ou, le cas douteux où la couleur est transparente.

+0

Merci, c'est intéressant. J'ai créé un nouveau projet vide, et il ne fonctionne pas non plus sur Android. Débogage à travers elle, je peux voir que la méthode OnCanvasViewPaintSurface du contrôle n'est jamais appelée. Vraisemblablement, il me manque quelque chose dans mon XAML ou ailleurs pour déclencher cela. –

+0

Vous devez vous assurer que la taille du canevas n'est pas 0x0. Quelle est la disposition/conteneur? vous devrez peut-être définir une taille ou des options de mise en page dans la vue en dégradé. – Matthew

+0

J'ai essayé de définir les options de disposition/taille mais pas de différence. Si je donne au contrôle une couleur de fond qui apparaît. Mais j'apprécie que ce n'est pas nécessairement lié à la taille de la toile –