Пример #1
0
        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();
        }