public void Invalidate() { if (_renderer?.NativeView == null || _pathProvider == null) { return; } _pathProvider?.Invalidate(); _renderer.NativeView.FindLayerOfType <GradientStrokeLayer>()?.InvalidatePath(); _renderer.NativeView.FindLayerOfType <GradientStrokeLayer>()?.SetNeedsDisplay(); if (_renderer.NativeView.Subviews == null || _renderer.Element == null) { return; } var transform = GetMaskTransform(_renderer.Element); var maskPath = _pathProvider.CreateBorderedPath(_renderer.NativeView.Bounds); foreach (var subView in _renderer.NativeView.Subviews) { if (subView?.Layer == null) { continue; } if (subView.Layer.Sublayers?.FirstOrDefault( l => l is GradientStrokeLayer) != null) { continue; } subView.Layer.Mask?.Dispose(); subView.Layer.Mask = new CAShapeLayer { Frame = _renderer.NativeView.Bounds, Path = transform == null ? maskPath : new CGPath(maskPath, transform.Value) }; subView.Layer.MasksToBounds = true; } InvalidateInkLayer(); }