gpt4 book ai didi

ios 覆盖drawRect后设置RoundCorner不起作用,但正常的UIView没问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 22:05:58 24 4
gpt4 key购买 nike

我写了一个关于Wave Animation的例子。动画没问题,但是我不明白为什么自定义UIView需要添加“self.layer.masksToBounds = YES”才能有圆角.

  1. 这是一个自定义 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];
    }
    }

View Controller :

self.wave = [[waveAnimation alloc] init];
[self.wave startAnimation];
[self.view addSubview:self.wave];
  1. 这是一个普通的 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 实现所需圆角的原因是因为您在这里告诉 View 将所有 layers 屏蔽到框架的边界。

在您使用 UIView 的第二个示例中,圆角半径按预期显示,因为您没有调整它的图层。

如果您需要 masksToBounds = NO,我建议采用设置 masksToBounds 或以不同的方式重绘 View 的边界。由于您有“波浪形”sin 曲线并且您想要圆角,也许只需创建一个通用的圆角矩形(一个具有所需角半径的矩形),然后将其与您已经使用 sin 波创建的路径合并。

Merge multiple CGPaths together to make one path

该链接可以帮助您将圆形 View 与自定义 View 合并,以获得所需的最终结果。

否则.. 最好将其设置为是。

关于ios 覆盖drawRect后设置RoundCorner不起作用,但正常的UIView没问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47533748/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com