Thay vì subclassing, bạn có thể đạt được chức năng mạnh mẽ hơn thông qua loại đơn giản trên UIImageView và CALayer.
Tạo một thể loại trên UIImageView như thế này:
- (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];
}
}
Điều này đòi hỏi một phương pháp loại trên 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;
}
Vì vậy, điều này cho phép bạn để làm tròn kết hợp bất kỳ (xem UIRectCorner
) của góc, đặc biệt hữu ích nếu bạn muốn đặt hình ảnh theo kiểu nhóm UITableView
. Có một báo trước khi thực hiện điều này tuy nhiên. Bởi vì chúng tôi đã không phân loại UIImageView
, chúng tôi không thể tiêm bất kỳ mã nào vào layoutSubviews
, điều đó có nghĩa là lớp mặt nạ có thể không chính xác. Trong thực tế, khi định cấu hình ô, các giới hạn của chế độ xem hình ảnh thậm chí sẽ không được đặt khi bạn gọi phương thức danh mục. Do đó, bạn cần đảm bảo giới hạn của chế độ xem hình ảnh được đặt trước khi thêm các góc tròn (trừ khi sử dụng UIRectCornersAllCorners
).
Dưới đây là một số mã mà thực hiện điều này:
// 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];
}
tôi có một loại mà loại bỏ các góc tròn - tất cả điều đó không được loại bỏ bất kỳ mặt nạ và thiết lập cornerRadius
để 0.
Nguồn
2012-05-09 11:53:17
Xin chào Jack - cảm ơn vì điều này, đó chính là điều tôi muốn làm. Khi tôi cố gắng sử dụng điều này tôi nhận được một lỗi 'truy cập không rõ' cornerRadius 'thành phần của một tài sản', và tương tự cho masksToBounds vv Oddly tính năng mã cảm giác trong xcode helpfully điền vào các thuộc tính cho tôi, nhưng trình biên dịch sẽ không biên dịch chúng. Mã trên có hoạt động cho bạn trên iOS4.0 không? –
Bạn cần # import –
vodkhang