2010-08-28 62 views

Trả lời

65

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?.

+1

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

+1

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

+2

Tôi cũng có thể thêm đường viền quanh đường dẫn này để tô sáng không .. ?? –

2

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!

+0

Tôi có thể thêm đường viền quanh đường dẫn này để tô sáng không .. ?? –

0
+ (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 đó.

0

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; 
}