菜鸟教程小白 发表于 2022-12-11 19:23:05

ios覆盖drawRect后设置RoundCorner不起作用,但正常的UIView是可以的


                                            <p><p>我写了一个关于Wave Animation的例子,动画还可以,但是我不明白为什么自定义UIView需要添加“<strong>self.layer.masksToBounds = YES</strong>”才能有圆角.</p>

<ol>
<li><p>这是一个自定义 UIView。我已经重写了它的drawRect。如果我不将“<em>masksToBounds</em>”设置为 YES,圆角就会消失。</p>

<pre><code>- (instancetype)initWithFrame:(CGRect)frame
{
    self = ;
    if (self) {
      self.frame = CGRectMake(10, 40, 300, 300);
      self.layer.cornerRadius = 150;
      self.backgroundColor = ;
      self.layer.borderColor = .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, .CGColor);
    CGPathMoveToPoint(path, NULL, 0, 0);

    for(float i=0; i&lt;=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 = ;
    }
}

- (void)refresh {
    self.x_move += 0.3;
    self.y_move -= 0.2;
    if(self.y_move - 100 &lt; 0.00001){
      ;
    }else{
      ;
    }
}
</code></pre> </li>
</ol>

<p> ViewController :</p>

<pre><code>self.wave = [ init];
;
;
</code></pre>

<ol 开始=“2”>
<li><p>这是一个普通的 UIView。它的 "<em>masksToBunds</em>"是 NO,但它的圆角显示正常。对比上面的例子,为什么要加,一个不需要。</p>

<pre><code>UIView *view = [ initWithFrame:CGRectMake(20, 60, 100, 100)];
view.backgroundColor = ;
view.layer.cornerRadius = 50;
view.layer.borderWidth = 2;
view.layer.borderColor = .CGColor;
;
</code></pre> </li>
</ol></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>原因在于您对 <code>drawRect:(CGRect)frame</code> 的覆盖。 </p>

<p>您正在尝试设置层的圆角半径,该层<strong>不是</strong>您分配填充颜色的元素。设置 <code>masksToBounds</code> 实现所需圆角的原因是因为在这里您告诉 View 将其所有 <em>layers</em> 屏蔽到框架的边界。</p>

<p>在您使用 <code>UIView</code> 的第二个示例中,角半径按预期显示,因为您尚未调整它的图层。</p>

<p>如果您<strong>需要</strong> <code>masksToBounds = NO</code>,我建议采用设置<code>masksToBounds</code> 或以不同的方式重新绘制 View 的边界。既然你有“波浪形”正弦曲线并且你想要圆角,也许只需创建一个通用的圆角矩形(一个具有所需角半径的矩形),然后将它与你已经用正弦波创建的路径合并。</p>

<p> <a href="https://stackoverflow.com/questions/17539397/merge-multiple-cgpaths-together-to-make-one-path" rel="noreferrer noopener nofollow">Merge multiple CGPaths together to make one path</a> </p>

<p>该链接可以帮助您将圆形 View 与自定义 View 合并,以实现所需的最终结果。</p>

<p>否则.. 最好将其设置为是。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios覆盖drawRect后设置RoundCorner不起作用,但正常的UIView是可以的,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/47533748/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/47533748/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios覆盖drawRect后设置RoundCorner不起作用,但正常的UIView是可以的