我想为项目中的所有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;
}
答案 0 :(得分:114)
检查一下 - Rounded Corners on 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];
答案 1 :(得分:25)
你可以使用UIImage的一个类别,这是一种替代Class的替代方法,有时候只需要很小的改动就可以了。
例如,添加一个返回带有圆角属性的UIImage的方法。
+(UIImage *)imageWithContentsOfFile:(NSString *)file cornerRadius:(NSInteger)...
可以找到关于Objective-c类别的更多信息http://macdevelopertips.com/objective-c/objective-c-categories.html
答案 2 :(得分: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
,这意味着掩码层可能不正确。实际上,在配置单元格时,调用类别方法时甚至不会设置图像视图的边界。因此,您需要确保在添加圆角之前设置图像视图的边界(使用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。
答案 3 :(得分:5)
是的,您应该继承UIImageView,并在整个项目中使用自定义子类。
答案 4 :(得分: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];
}
答案 5 :(得分: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];
这可能对你有帮助。