ios 覆盖drawRect后设置RoundCorner不起作用,但正常的UIView是可以的
ios Setting the RoundCorner does not work after override drawRect,but normal UIView is ok
我写了一个关于Wave的例子Animation.The动画可以,但是我不明白为什么自定义UIView需要添加“self.layer.masksToBounds = YES" 有圆角。
这是一个自定义的 UIView。我重写了它的drawRect。如果我不将“masksToBounds”设置为 YES,圆角就会消失。
- (instancetype)initWithFrame:(CGRect)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)drawRect:(CGRect)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 selector:@selector(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];
}
}
ViewController:
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];
这是因为您对 drawRect:(CGRect)frame
的覆盖。
您正在尝试设置图层的角半径,不是您为其分配了填充颜色的元素。设置 masksToBounds
达到所需圆角的原因是因为您在这里告诉视图将所有 图层 屏蔽到框架的边界。
在你的第二个例子中 UIView
圆角半径按预期显示,因为你没有调整它的图层。
如果您需要 masksToBounds = NO
,我建议采用设置 masksToBounds
或以不同的方式重新绘制视图的边界。因为你有 "squiggle" sin 曲线并且你想要圆角,也许只是创建一个通用的圆角矩形(一个具有所需的角半径)然后将其与你已经用 sin 波创建的路径合并。
Merge multiple CGPaths together to make one path
link 可能会帮助您将圆形视图与自定义视图合并,以获得所需的最终结果。
否则..最好将其设置为是。
我写了一个关于Wave的例子Animation.The动画可以,但是我不明白为什么自定义UIView需要添加“self.layer.masksToBounds = YES" 有圆角。
这是一个自定义的 UIView。我重写了它的drawRect。如果我不将“masksToBounds”设置为 YES,圆角就会消失。
- (instancetype)initWithFrame:(CGRect)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)drawRect:(CGRect)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 selector:@selector(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]; } }
ViewController:
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];
这是因为您对 drawRect:(CGRect)frame
的覆盖。
您正在尝试设置图层的角半径,不是您为其分配了填充颜色的元素。设置 masksToBounds
达到所需圆角的原因是因为您在这里告诉视图将所有 图层 屏蔽到框架的边界。
在你的第二个例子中 UIView
圆角半径按预期显示,因为你没有调整它的图层。
如果您需要 masksToBounds = NO
,我建议采用设置 masksToBounds
或以不同的方式重新绘制视图的边界。因为你有 "squiggle" sin 曲线并且你想要圆角,也许只是创建一个通用的圆角矩形(一个具有所需的角半径)然后将其与你已经用 sin 波创建的路径合并。
Merge multiple CGPaths together to make one path
link 可能会帮助您将圆形视图与自定义视图合并,以获得所需的最终结果。
否则..最好将其设置为是。