我正在使用此代码使我的上角变圆。

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
{
    UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                  byRoundingCorners:corners
                                                        cornerRadii:CGSizeMake(5.0, 5.0)];
    CAShapeLayer *shape = [[CAShapeLayer alloc] init];
    [shape setPath:rounded.CGPath];
    view.layer.mask = shape;
}

然后在superview方法的initWithFrame中,我这样做:
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
[self setMaskTo:imageView byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];

但结果是我看不到图片。我使用的是自动布局约束,可以正常工作,如果我不使用上述圆角方法,我会看到图像。但是,如果使用它,则看不到图像。

似乎如果使用放置图像的视图的draw rect回调,我可以设置圆角。但是在这种情况下,如果视图包含其他视图,那么如果我将其循环,它将为所有子视图添加舍入:

它可以工作,但是当然适用于所有子视图:
- (void)drawRect:(CGRect)rect {
    // Drawing code

    for (UIView *view in self.subviews)
    {
        [self setMaskTo:view byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];
    }

}

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
{
    UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                                  byRoundingCorners:corners
                                                        cornerRadii:CGSizeMake(5.0, 5.0)];
    CAShapeLayer *shape = [[CAShapeLayer alloc] init];
    [shape setPath:rounded.CGPath];
    view.layer.mask = shape;
}

因此,如何检测图像视图何时具有框架,我想框架在开始时为零,CALayer无法理解如何与视图进行交互。

最佳答案

发生这种情况是因为您使用框架CGRectZero实例化了视图,然后使用该边界作为蒙版,因此视图中没有任何内容位于蒙版内部,因此没有显示任何内容。

作为一种变通办法,您可以将UIImageView实例的标记设置为非0并在子视图中搜索该标记

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
imageView.tag = 111; //or any other number you want

- (void)drawRect:(CGRect)rect {
// Drawing code

for (UIView *view in self.subviews)
{
    if (view.tag==111){[self setMaskTo:view byRoundingCorners:UIRectCornerTopLeft|UIRectCornerTopRight];
}}

}

- (void)setMaskTo:(UIView*)view byRoundingCorners:(UIRectCorner)corners
{
UIBezierPath *rounded = [UIBezierPath bezierPathWithRoundedRect:view.bounds
                                              byRoundingCorners:corners
                                                    cornerRadii:CGSizeMake(5.0, 5.0)];
CAShapeLayer *shape = [[CAShapeLayer alloc] init];
[shape setPath:rounded.CGPath];
view.layer.mask = shape;
}

10-08 05:54