78

我想为我项目中的所有 UIImageView 添加一些圆角。我已经让代码工作了,但我必须将它应用到每张图片上;我应该继承 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;
}
4

6 回答 6

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];
于 2010-01-31T12:29:40.123 回答
25

您可以为 UIImage 使用类别,这是对 Class 进行子类化的另一种方法,有时更容易进行小的更改。

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

+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)... 

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

于 2010-01-31T11:50:31.333 回答
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];
    }
}

这会调用 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;
}

因此,这允许您对角的任意组合(请参阅UIRectCorner)进行圆角处理,如果您想将图像置于组样式中,这将特别方便UITableView。但是,这样做有一个警告。因为我们没有子类化UIImageView,所以我们不能向 中注入任何代码layoutSubviews,这意味着遮罩层可能不正确。实际上,在配置单元格时,调用 category 方法时甚至不会设置图像视图的边界。因此,您需要确保在添加圆角之前设置图像视图的边界(除非使用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];
        }

我有另一个删除圆角的类别 - 所做的只是删除任何蒙版并将其设置cornerRadius为 0。

于 2012-05-09T11:53:17.837 回答
5

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

于 2010-01-31T11:46:13.283 回答
4

您可以将 UIImageView 子类化,然后如果您实现其setNeedsDisplay方法,圆角将适用于子类。(不要忘记导入 QuartzCore)

-(void)setNeedsDisplay {
    self.layer.cornerRadius = 5;
    self.layer.masksToBounds = YES;
    [self.layer setBorderColor:[[UIColor whiteColor] CGColor]];
    [self.layer setBorderWidth: 2.0];
}
于 2012-05-23T13:26:59.450 回答
3

尝试这个,

coverImage.image = [UIImage imageWithContentsOfFile:@"coverImage.png"]; 
coverImage.layer.masksToBounds = YES;
coverImage.layer.cornerRadius = 10.0;
coverImage.layer.borderWidth = 1.0;
coverImage.layer.borderColor = [[UIColor brown] CGColor];

这可能会对您有所帮助。

于 2013-01-16T11:13:42.337 回答