2017-08-15 5 views
0

Wir brauchen einen Farbverlauf auf unseren Seiten, also verwenden wir SkiaSharp und eine GradientView. Dies funktioniert unter Android, funktioniert aber nicht unter iOS - der Farbverlauf wird einfach nicht angezeigt.Xamarin.Forms SkiaSharp Gradient funktioniert auf Android aber nicht auf iOS

Müssen wir eine iOS-spezifische Initialisierung für SkiaSharp auf iOS durchführen, mit Renderern oder Code im AppDelegate?

Bearbeiten Dies läuft auf einem iPad mit iOS 10.3.3. Unsere 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> 

Unsere 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); 
     } 
    } 
} 

Antwort

0

Vielleicht haben Sie die nugets nicht installiert (beide SkiaSharp und SkiaSharp.Views.Forms) in das iOS-Projekt?

Ich kopierte Ihren Code in eine brandneue App, und es funktionierte zum ersten Mal.

Einige andere Dinge, die das Problem sein können, ist, dass die Ansichtshöhe/-breite 0 ist. Oder der zwielichtige Fall, in dem die Farbe transparent ist.

+0

Danke, das ist interessant. Ich habe ein leeres neues Projekt erstellt und es funktioniert jetzt auch nicht mit Android. Beim Debuggen kann ich sehen, dass die OnCanvasViewPaintSurface-Methode des Controls nie aufgerufen wird. Vermutlich vermisse ich etwas in meinem XAML oder anderswo, um dies auszulösen. –

+0

Sie müssen sicherstellen, dass die Leinwandgröße nicht 0x0 ist. Was ist das Layout/Container? Möglicherweise müssen Sie in der Verlaufsansicht entweder eine Größe oder Layoutoptionen festlegen. – Matthew

+0

Ich habe versucht, Layout/Größe Optionen, aber keinen Unterschied. Wenn ich dem Steuerelement eine Hintergrundfarbe gebe, die angezeigt wird. Aber ich schätze, dass dies nicht unbedingt mit der Leinwandgröße zusammenhängt –

Verwandte Themen