Eri*_*ric 14 core-animation calayer uiview ios
我正试图用CALayers制作甜甜圈.一个CALayer将是一个大圆圈,另一个将是一个位于其中心的较小圆圈,掩盖它.
大圆圈显示正常,但每当我打电话时circle.mask = circleMask;,视图显示为空.
这是我的代码:
AriDonut.h
#import <UIKit/UIKit.h>
@interface AriDonut : UIView
-(id)initWithRadius:(float)radius;
@end
Run Code Online (Sandbox Code Playgroud)
AriDonut.m
#import "AriDonut.h"
#import <QuartzCore/QuartzCore.h>
@implementation AriDonut
-(id)initWithRadius:(float)radius{
self = [super initWithFrame:CGRectMake(0, 0, radius, radius)];
if(self){
//LARGE CIRCLE
CALayer *circle = [CALayer layer];
circle.bounds = CGRectMake(0, 0, radius, radius);
circle.backgroundColor = [UIColor redColor].CGColor;
circle.cornerRadius = radius/2;
circle.position = CGPointMake(radius/2, radius/2);
//SMALL CIRLCE
CALayer *circleMask = [CALayer layer];
circleMask.bounds = CGRectMake(0, 0, 10, 10);
circleMask.cornerRadius = radius/2;
circleMask.position = circle.position;
//circle.mask = circleMask;
[self.layer addSublayer:circle];
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
我试过像这样设置大圆圈的超级层nil:
CALayer *theSuper = circle.superlayer;
theSuper = nil;
Run Code Online (Sandbox Code Playgroud)
但它并没有什么不同.
我也尝试将Circle的masksToBounds属性设置为YES和NO,但它没有任何区别.
有什么想法吗?
Eri*_*ric 14
实际上,由于@David表示当前(iOS 5.1)CALayer蒙版无法反转,如果您想使用它们将透明孔制作为简单的圆形CALayer,则会出现问题.
你可以做些什么来制作一个圆形的CALayer是backgroundColor透明的,但给它borderColor一个宽的borderWidth.这是dunkin'代码:
CALayer *theDonut = [CALayer layer];
theDonut.bounds = CGRectMake(0,0, radius, radius);
theDonut.cornerRadius = radius/2;
theDonut.backgroundColor = [UIColor clearColor].CGColor;
theDonut.borderWidth = radius/5;
theDonut.borderColor = [UIColor orangeColor].CGColor;
[self.layer addSublayer:theDonut];
Run Code Online (Sandbox Code Playgroud)
使用UIBezierPath和CAShapeLayer作为屏蔽层非常容易.编写的代码示例就像它在UIView子类中一样.
Objective-C的:
CGRect outerRect = self.bounds;
CGFloat inset = 0.2 * outerRect.size.width; // adjust as necessary for more or less meaty donuts
CGFloat innerDiameter = outerRect.size.width - 2.0 * inset;
CGRect innerRect = CGRectMake(inset, inset, innerDiameter, innerDiameter);
UIBezierPath *outerCircle = [UIBezierPath bezierPathWithRoundedRect:outerRect cornerRadius:outerRect.size.width * 0.5];
UIBezierPath *innerCircle = [UIBezierPath bezierPathWithRoundedRect:innerRect cornerRadius:innerRect.size.width * 0.5];
[outerCircle appendPath:innerCircle];
CAShapeLayer *maskLayer = [CAShapeLayer new];
maskLayer.fillRule = kCAFillRuleEvenOdd; // Going from the outside of the layer, each time a path is crossed, add one. Each time the count is odd, we are "inside" the path.
maskLayer.path = outerCircle.CGPath;
self.layer.mask = maskLayer;
Run Code Online (Sandbox Code Playgroud)
迅速:
let outerRect = self.bounds
let inset: CGFloat = 0.2 * outerRect.width // adjust as necessary for more or less meaty donuts
let innerDiameter = outerRect.width - 2.0 * inset
let innerRect = CGRect(x: inset, y: inset, width: innerDiameter, height: innerDiameter)
let outerCircle = UIBezierPath(roundedRect: outerRect, cornerRadius: outerRect.width * 0.5)
let innerCircle = UIBezierPath(roundedRect: innerRect, cornerRadius: innerRect.width * 0.5)
outerCircle.appendPath(innerCircle)
let mask = CAShapeLayer()
mask.fillRule = kCAFillRuleEvenOdd
mask.path = outerCircle.CGPath
self.layer.mask = mask
Run Code Online (Sandbox Code Playgroud)
它是用作遮罩的遮罩层内容的alpha值.(如果要将蒙版添加为子图层而不是将其用作蒙版.当用作蒙版时,子图层覆盖的所有内容都将可见.当用作蒙版时,子图层未覆盖的所有内容都将被隐藏.)
由于您的小圆圈是完全透明的,所以一切都被掩盖了(隐藏).如果你将backgroundColor它设置为任何完全不透明的颜色(只有alpha值用于蒙版),那么它将让这些像素通过.
请注意,这与您想要的相反.这将使您只看到"甜甜圈的洞"可见.没有内置的方法来做反向掩码相反,你必须以其他方式绘制掩码的内容,如使用CAShapeLayer或使用drawInContext:.
| 归档时间: |
|
| 查看次数: |
18141 次 |
| 最近记录: |