diff --git a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Mac/SKGLViewRenderer.cs b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Mac/SKGLViewRenderer.cs index b3bb71ad92..6454dc9a7e 100644 --- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Mac/SKGLViewRenderer.cs +++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.Mac/SKGLViewRenderer.cs @@ -1,4 +1,5 @@ -using CoreVideo; +using System; +using CoreVideo; using Xamarin.Forms; using SKFormsView = SkiaSharp.Views.Forms.SKGLView; @@ -46,7 +47,7 @@ protected override void SetupRenderLoop(bool oneShot) var nativeView = Control; nativeView?.BeginInvokeOnMainThread(() => { - if (nativeView != null) + if (nativeView.Handle != IntPtr.Zero) nativeView.NeedsDisplay = true; }); return; @@ -59,21 +60,22 @@ protected override void SetupRenderLoop(bool oneShot) var nativeView = Control; var formsView = Element; - // redraw the view - nativeView?.BeginInvokeOnMainThread(() => - { - if (nativeView != null) - nativeView.NeedsDisplay = true; - }); - // stop the render loop if this was a one-shot, or the views are disposed - if (nativeView == null || formsView == null || !formsView.HasRenderLoop) + if (nativeView == null || formsView == null || nativeView.Handle == IntPtr.Zero || !formsView.HasRenderLoop) { displayLink.Stop(); displayLink.Dispose(); displayLink = null; + return CVReturn.Success; } + // redraw the view + nativeView?.BeginInvokeOnMainThread(() => + { + if (nativeView != null) + nativeView.NeedsDisplay = true; + }); + return CVReturn.Success; }); displayLink.Start(); diff --git a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.iOS/SKGLViewRenderer.cs b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.iOS/SKGLViewRenderer.cs index c33dce3b29..5d1eed265e 100644 --- a/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.iOS/SKGLViewRenderer.cs +++ b/source/SkiaSharp.Views.Forms/SkiaSharp.Views.Forms.iOS/SKGLViewRenderer.cs @@ -1,4 +1,5 @@ -using CoreAnimation; +using System; +using CoreAnimation; using Foundation; using Xamarin.Forms; @@ -39,7 +40,7 @@ protected override void Dispose(bool disposing) displayLink.Dispose(); displayLink = null; } - + base.Dispose(disposing); } @@ -57,7 +58,11 @@ protected override void SetupRenderLoop(bool oneShot) if (oneShot) { var nativeView = Control; - nativeView?.BeginInvokeOnMainThread(() => nativeView?.Display()); + nativeView?.BeginInvokeOnMainThread(() => + { + if (nativeView.Handle != IntPtr.Zero) + nativeView.Display(); + }); return; } @@ -67,16 +72,17 @@ protected override void SetupRenderLoop(bool oneShot) var nativeView = Control; var formsView = Element; - // redraw the view - nativeView?.Display(); - // stop the render loop if this was a one-shot, or the views are disposed - if (nativeView == null || formsView == null || !formsView.HasRenderLoop) + if (nativeView == null || formsView == null || nativeView.Handle == IntPtr.Zero || !formsView.HasRenderLoop) { displayLink.Invalidate(); displayLink.Dispose(); displayLink = null; + return; } + + // redraw the view + nativeView.Display(); }); displayLink.AddToRunLoop(NSRunLoop.Current, NSRunLoop.NSDefaultRunLoopMode); }