为所有UIImageViews添加圆角

Jac*_*ack 78 code-reuse subclass ios objective-c-category

我想在我的项目中为所有UIImageViews添加一些圆角.我已经有了代码工作,但我必须将它应用于每个图像; 我应该继承UIImageView来添加它吗?如果是这样,有人可以给我一些指示如何做到这一点?

这是代码

- (void)viewDidLoad {
    [super viewDidLoad];
    NSString *mainpath = [[NSBundle mainBundle] bundlePath];
    welcomeImageView.image = [UIImage imageWithContentsOfFile:[mainpath stringByAppendingString:@"/test.png"]];
    welcomeImageView.layer.cornerRadius = 9.0;
    welcomeImageView.layer.masksToBounds = YES;
    welcomeImageView.layer.borderColor = [UIColor blackColor].CGColor;
    welcomeImageView.layer.borderWidth = 3.0;
    CGRect frame = welcomeImageView.frame;
    frame.size.width = 100;
    frame.size.height = 100;
    welcomeImageView.frame = frame;
}
Run Code Online (Sandbox Code Playgroud)

NP *_*ete 114

检查一下 - UIImage上的圆角

层修改似乎是最好的方法.

UIImageView * roundedView = [[UIImageView alloc] initWithImage: [UIImage imageNamed:@"wood.jpg"]];
// Get the Layer of any view
CALayer * l = [roundedView layer];
[l setMasksToBounds:YES];
[l setCornerRadius:10.0];
Run Code Online (Sandbox Code Playgroud)


小智 25

你可以使用UIImage的类别,这是一种替代Class的替代方法,有时候只需要很小的更改.

例如,添加一个返回带有圆角属性集的UIImage的方法.

+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)... 
Run Code Online (Sandbox Code Playgroud)

有关Objective-c类别的更多信息,请访问http://macdevelopertips.com/objective-c/objective-c-categories.html

  • 我将描述如何进行子类化,但我更喜欢这种方法. (4认同)
  • @Rob实际上,使用这种方法,0%的UIImages会有圆角,直到你改变它们来调用新方法.此解决方案不会覆盖现有方法(您不应该这样做).这可能是一个比子类更清晰的解决方案,因为它不需要一个完整的子类 - 这可能是过度的,因为你没有向UIImage添加任何成员或新功能 - 你想要的只是一个UIImage圆角而不是代码重复. (3认同)

Dan*_*rpe 16

您可以通过UIImageView和CALayer上的简单类别实现更强大的功能,而不是子类化.

在UIImageView上创建一个类别,如下所示:

- (void)maskRoundCorners:(UIRectCorner)corners radius:(CGFloat)radius {
    // To round all corners, we can just set the radius on the layer
    if ( corners == UIRectCornerAllCorners ) {
        self.layer.cornerRadius = radius;
        self.layer.masksToBounds = YES;
    } else {
        // If we want to choose which corners we want to mask then
        // it is necessary to create a mask layer.
        self.layer.mask = [CALayer maskLayerWithCorners:corners radii:CGSizeMake(radius, radius) frame:self.bounds];
    }
}
Run Code Online (Sandbox Code Playgroud)

这会在CALayer上调用类别方法:

+ (id)maskLayerWithCorners:(UIRectCorner)corners radii:(CGSize)radii frame:(CGRect)frame {

    // Create a CAShapeLayer
    CAShapeLayer *mask = [CAShapeLayer layer];

    // Set the frame
    mask.frame = frame;

    // Set the CGPath from a UIBezierPath
    mask.path = [UIBezierPath bezierPathWithRoundedRect:mask.bounds byRoundingCorners:corners cornerRadii:radii].CGPath;

    // Set the fill color
    mask.fillColor = [UIColor whiteColor].CGColor;

    return mask;
}
Run Code Online (Sandbox Code Playgroud)

因此,这允许您对UIRectCorner角的任何组合(参见)进行舍入,如果您想要将图像放入组样式中,这将特别方便UITableView.但是,这样做有一点需要注意.因为我们没有子类化UIImageView,所以我们不能注入任何代码layoutSubviews,这意味着掩码层可能不正确.实际上,在配置单元格时,调用类别方法时甚至不会设置图像视图的边界.因此,您需要确保在添加圆角之前设置图像视图的边界(使用时除外UIRectCornersAllCorners).

这是一些代码,它执行此操作:

        // Perform corner rounding
        UIRectCorner corners = !UIRectCornerAllCorners;
        if (indexPath.row == 0) 
            corners = UIRectCornerTopLeft;
        if (indexPath.row == numberOfRowsInTheTable)  
            corners |= UIRectCornerBottomLeft;

        if (corners > 0) {
            cell.imageView.bounds = CGRectMake(0.f, 0.f, [self.tableView rowHeight], [self.tableView rowHeight]);
            [cell.imageView maskRoundCorners:corners radius:10.f];
        } else {
            [cell.imageView removeRoundCornersMask];
        }
Run Code Online (Sandbox Code Playgroud)

我有另一个删除圆角的类别 - 所有这一切都是删除任何掩码并将其设置cornerRadius为0.


Ben*_*ieb 5

是的,您应该继承UIImageView,并在整个项目中使用自定义子类.

  • 实际上,Martinj的上述答案可能更容易,使您无需在Interface Builder等处使用自定义子类. (2认同)