我写了一个关于Wave Animation的例子,动画还可以,但是我不明白为什么自定义UIView需要添加“self.layer.masksToBounds = YES”才能有圆角.
这是一个自定义 UIView。我已经重写了它的drawRect。如果我不将“masksToBounds”设置为 YES,圆角就会消失。
- (instancetype)initWithFrameCGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
self.frame = CGRectMake(10, 40, 300, 300);
self.layer.cornerRadius = 150;
self.backgroundColor = [UIColor greenColor];
self.layer.borderColor = [UIColor blueColor].CGColor;
self.layer.borderWidth = 2;
// self.layer.masksToBounds = YES; //if write this line,the round corner appear
self.x_move = 0;
self.y_move = 300;
}
return self;
}
- (void)drawRectCGRect)rect {
CGContextRef context = UIGraphicsGetCurrentContext();
CGMutablePathRef path = CGPathCreateMutable();
CGContextSetLineWidth(context, 1);
CGContextSetFillColorWithColor(context, [UIColor grayColor].CGColor);
CGPathMoveToPoint(path, NULL, 0, 0);
for(float i=0; i<=300; i++){
float x=i;
float y = 5 * sin( 0.05 * x+ self.x_move) + self.y_move;
CGPathAddLineToPoint(path, nil, x, y);
}
CGPathAddLineToPoint(path, nil, 300, 0);
CGPathAddLineToPoint(path, nil, 0, 0);
CGContextAddPath(context, path);
CGContextFillPath(context);
CGContextDrawPath(context, kCGPathStroke);
CGPathRelease(path);
}
- (void)startAnimation {
if (self.waveTimer == nil) {
self.waveTimer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self selectorselector(refresh) userInfo:nil repeats:YES];
}
}
- (void)refresh {
self.x_move += 0.3;
self.y_move -= 0.2;
if(self.y_move - 100 < 0.00001){
[self.waveTimer invalidate];
}else{
[self setNeedsDisplay];
}
}
View Controller :
self.wave = [[waveAnimation alloc] init];
[self.wave startAnimation];
[self.view addSubview:self.wave];
这是一个普通的 UIView。它的 "masksToBunds"是 NO,但它的圆角显示正常。对比上面的例子,为什么要加,一个不需要。
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(20, 60, 100, 100)];
view.backgroundColor = [UIColor greenColor];
view.layer.cornerRadius = 50;
view.layer.borderWidth = 2;
view.layer.borderColor = [UIColor blackColor].CGColor;
[self.view addSubview:view];
Best Answer-推荐答案 strong>
原因在于您对 drawRectCGRect)frame 的覆盖。
您正在尝试设置层的圆角半径,该层不是您分配填充颜色的元素。设置 masksToBounds 实现所需圆角的原因是因为在这里您告诉 View 将其所有 layers 屏蔽到框架的边界。
在您使用 UIView 的第二个示例中,角半径按预期显示,因为您尚未调整它的图层。
如果您需要 masksToBounds = NO ,我建议采用设置masksToBounds 或以不同的方式重新绘制 View 的边界。既然你有“波浪形”正弦曲线并且你想要圆角,也许只需创建一个通用的圆角矩形(一个具有所需角半径的矩形),然后将它与你已经用正弦波创建的路径合并。
Merge multiple CGPaths together to make one path
该链接可以帮助您将圆形 View 与自定义 View 合并,以实现所需的最终结果。
否则.. 最好将其设置为是。
关于ios覆盖drawRect后设置RoundCorner不起作用,但正常的UIView是可以的,我们在Stack Overflow上找到一个类似的问题:
https://stackoverflow.com/questions/47533748/
|