ios - 图层蒙版的蒙版。核心动画
问题描述
我深入了解核心动画并且在图层蒙版方面遇到了一些问题
出于学习原因,我尝试用透明的东西制作一个复杂的 UI 层
这个观点一个有并投入了ViewController
public class TestView : UIView
{
public TestView()
{
Layer.Delegate = this;
Frame = new CGRect(100f,200f, 100f, 100f);
}
public override void LayoutSublayersOfLayer(CALayer layer)
{
base.LayoutSublayersOfLayer(layer);
var bounds = Bounds;
var circleFrame = new CGRect(20, 20, 60, 60);
var imageFrame = new CGRect(30, 30, 40, 40);
Layer.BorderWidth = 5;
Layer.BorderColor = UIColor.Red.CGColor;
Layer.CornerRadius = 4;
var gradientLayer = new CAGradientLayer();
gradientLayer.Colors = new[] { UIColor.Green.CGColor, UIColor.Red.CGColor };
gradientLayer.Frame = bounds;
Layer.AddSublayer(gradientLayer);
var maskOfGradientLayer = new CAShapeLayer();
var path = UIBezierPath.FromRoundedRect(circleFrame, 30);
path.UsesEvenOddFillRule = true;
maskOfGradientLayer.Path = path.CGPath;
maskOfGradientLayer.FillRule = CAShapeLayer.FillRuleEvenOdd;
maskOfGradientLayer.FillColor = UIColor.Black.CGColor;
maskOfGradientLayer.Frame = bounds;
gradientLayer.Mask = maskOfGradientLayer;
var maskOfMaskLayer = new CAShapeLayer();
maskOfMaskLayer.Frame = imageFrame;
maskOfMaskLayer.FillColor = UIColor.Black.CGColor;
maskOfMaskLayer.Contents = Bundles.ImageOff.CGImage;
Layer.AddSublayer(maskOfMaskLayer);
}
}
我有,这正是我想要的。
但我也希望可以使圆形透明而不是黑色。
我试着做这样maskOfGradientLayer.Mask = maskOfMaskLayer.
但是这种方式maskOfMaskLayer
什么都不做!它不像面具必须做的那样工作。
我应该怎么做?
解决方案
但我也希望可以使圆形透明而不是黑色。
解决方案探索版:
您还可以使用UIBezierPath来绘制您想要的内容,并设置为maskOfMaskLayer
:
var maskOfMaskLayer = new CAShapeLayer();
maskOfMaskLayer.Frame = imageFrame;
maskOfMaskLayer.FillColor = UIColor.Black.CGColor;
maskOfMaskLayer.Contents = Bundles.ImageOff.CGImage;
Layer.AddSublayer(maskOfMaskLayer);
替换为以下代码:
UIBezierPath offCirclePath = new UIBezierPath();
// draw an arc
offCirclePath.AddArc(new CGPoint(50, 50), circleFrame.Width / 3, (nfloat)(1.75 * Math.PI), (nfloat)(1.25 * Math.PI), true);
//draw a line
offCirclePath.MoveTo(new CGPoint(50, 30));
offCirclePath.AddLineTo(new CGPoint(50, 45));
//set to maskOfMaskLayer
var maskOfMaskLayer = new CAShapeLayer();
maskOfMaskLayer.FillColor = UIColor.Clear.CGColor;
maskOfMaskLayer.Path = offCirclePath.CGPath;
maskOfMaskLayer.LineWidth = 5;
maskOfMaskLayer.StrokeColor = UIColor.White.CGColor;
maskOfMaskLayer.LineCap = new NSString("round");
Layer.AddSublayer(maskOfMaskLayer);
其他代码未更改。
但我从一开始就考虑设置任何自定义图像。
解决方案二:(方向错误)
我已经测试过CAShapeLayer
不能有这个功能来改变图像的颜色。CAShapeLayer 类
但是,我发现UIImageView
可以这样做。它有一个属性。这个TintColor
属性来自 UiView。UIView.TintColor 属性。
var maskOfMaskLayer = new CAShapeLayer();
maskOfMaskLayer.Frame = imageFrame;
maskOfMaskLayer.FillColor = UIColor.Black.CGColor;
maskOfMaskLayer.Contents = Bundles.ImageOff.CGImage;
Layer.AddSublayer(maskOfMaskLayer);
改成:
UIImageView imageView = new UIImageView();
imageView.Frame = imageFrame;
imageView.Image = Bundles.ImageOff;
imageView.TintColor = UIColor.White;
AddSubview(imageView);
正确的解决方案:
很抱歉误解了真正的想要的效果,我更新如下:
Layer.Mask = maskOfMaskLayer;
如果你使用AddSublayer
只是在图层上覆盖你的图像,并且Layer.Mask
是相反的效果,它只显示覆盖部分的背景,其余区域将是白色的。CALayer.Mask
推荐阅读
- angular - 业力 | 离子 | 未捕获的错误:未捕获的错误:未捕获(承诺中):TypeError:无法读取未定义的属性“getToken”
- jquery - jQuery wrapAll 不适用于 WordPress
- javascript - 如果我的容器 div 中的任何 div 被点击,我将如何检查 javascript
- c# - 尝试使用另一个变量 C# 设置列表的容量
- php - MySQL 在 PHPMyAdmin 中运行,但 var_dump 在 PHP 中返回 null
- r - 使用 R 中的 stplanr 在道路网络上进行本地路由
- vue.js - 使用 nuxtjs 刷新页面不更新视图
- r - 在 R 中,如果两个数据框具有匹配的公共 ID,我如何从一列中附加一个分类变量?
- firebase - 错误:HTTP 错误 400/部署错误。构建失败
- kubernetes-helm - 用于检测 values.yaml 中的节点的 Helm 模板函数