Xin chào! Tôi muốn vẽ một góc tròn của UIView
. Chỉ một, những người khác không thể thay đổi.Cách vẽ một góc tròn đơn của UIView.
Trả lời
Bắt đầu từ iOS 3.2, bạn có thể sử dụng chức năng của UIBezierPath
s để tạo một đường tròn được làm tròn hoàn toàn (chỉ các góc bạn chỉ định được làm tròn). Sau đó bạn có thể sử dụng như là con đường của một CAShapeLayer
, và sử dụng như một mặt nạ cho lớp xem của bạn:
// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:UIRectCornerTopLeft
cornerRadii:CGSizeMake(10.0, 10.0)];
// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
// Set the newly created shape layer as the mask for the image view's layer
imageView.layer.mask = maskLayer;
Và đó là nó - không rối tung xung quanh bằng tay xác định hình dạng trong lõi đồ họa, không có việc tạo mặt nạ hình ảnh trong Photoshop . Lớp thậm chí không cần vô hiệu. Áp dụng góc tròn hoặc thay đổi góc mới cũng đơn giản như xác định UIBezierPath
mới và sử dụng đường dẫn của lớp mặt nạ CGPath
. Tham số corners
của phương thức bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:
là một mặt nạ bitmap và vì vậy, nhiều góc có thể được làm tròn bằng cách BẬT chúng với nhau.
LƯU Ý - Mặt nạ lớp sẽ không hiển thị khi được sử dụng kết hợp với phương thức kết xuất CALInInext. Nếu bạn cần sử dụng góc làm tròn thử này, hãy làm như sau: Just two rounded corners?.
tôi đã thực hiện một phương pháp câu trả lời StuDev của:
+ (CAShapeLayer *) roundedCornerOnImage: (UIImageView *)imageView onCorner: (UIRectCorner)rectCorner
{
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:rectCorner
cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
return maskLayer;
}
Ví dụ về việc sử dụng trên một ImageView trong một UITableViewCell:
if (indexPath.row == 0)
cell.imageView.layer.mask = [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerTopLeft];
else if (indexPath.row == self.arrayPeople.count - 1)
cell.imageView.layer.mask = [Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerBottomLeft];
Nhờ StuDev cho một giải pháp tuyệt vời!
Tôi có thể thêm đường viền quanh đường dẫn này để tô sáng không .. ?? –
+ (CAShapeLayer *) roundedCornerOnImage: (UIImageView *)imageView onCorner: (UIRectCorner)rectCorner
{
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:rectCorner
cornerRadii:CGSizeMake(10.0, 10.0)];
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
imageView.layer.mask=maskLayer
return maskLayer;
}
if (indexPath.row == 0)
[Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerTopLeft];
else if (indexPath.row == self.arrayPeople.count - 1)
[Helper roundedCornerOnImage:cell.imageView onCorner:UIRectCornerBottomLeft];
Câu trả lời cập nhật ở trên, bạn không cần phải trả lại và quản lý điều đó. Nó có thể được thực hiện trong hàm đó.
Tôi đã thực hiện một chức năng cho làm cho bán kính Tuỳ chỉnh góc sau khi làm một số nhỏ R & D như sau:
+(void)setConerRadiusForTopLeft:(BOOL)isForTopLeft ForTopRight:(BOOL)isForTopRight ForBottomLeft:(BOOL)isForBottomLeft ForBottomRight:(BOOL)isForBottomRight withCornerRadius:(float)cornerRadius forView:(UIView *)view
{
UIRectCorner corners = (isForTopLeft ? UIRectCornerTopLeft : 0) |
(isForTopRight ? UIRectCornerTopRight : 0) |
(isForBottomLeft ? UIRectCornerBottomLeft : 0) |
(isForBottomRight ? UIRectCornerBottomRight : 0);
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:view.bounds
byRoundingCorners:corners
cornerRadii:CGSizeMake(cornerRadius, cornerRadius)];
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.frame = view.bounds;
maskLayer.path = maskPath.CGPath;
view.layer.mask = maskLayer;
}
Mã của bạn đã thực sự đã cứu tôi. Nếu tôi có cơ hội, tôi sẽ đánh dấu câu trả lời này đúng. – itsaboutcode
Một lưu ý: nếu bạn thay đổi kích thước của chế độ xem, bạn sẽ phải tạo lại mặt nạ. Vì vậy, phân lớp UIView và ghi đè lên khung và giới hạn. – Krumelur
Tôi cũng có thể thêm đường viền quanh đường dẫn này để tô sáng không .. ?? –