Tôi đã sử dụng câu trả lời ở Làm cách nào để tạo Nhãn UIL có góc tròn trên iPhone? và mã từ Chế độ xem hình chữ nhật tròn với độ trong suốt được thực hiện trên iPhone như thế nào? để tạo mã này.
Sau đó, tôi nhận ra mình đã trả lời sai câu hỏi (đã đưa ra một UILabel tròn thay vì UIImage) vì vậy tôi đã sử dụng mã này để thay đổi nó:
http://discussions.apple.com/thread.jspa?threadID=1683876
Tạo một dự án iPhone với mẫu View. Trong bộ điều khiển chế độ xem, hãy thêm cái này:
- (void)viewDidLoad
{
CGRect rect = CGRectMake(10, 10, 200, 100);
MyView *myView = [[MyView alloc] initWithFrame:rect];
[self.view addSubview:myView];
[super viewDidLoad];
}
MyView
chỉ là một UIImageView
lớp con:
@interface MyView : UIImageView
{
}
Tôi chưa bao giờ sử dụng các bối cảnh đồ họa trước đây, nhưng tôi đã xoay sở để tập hợp mã này. Nó thiếu mã cho hai trong số các góc. Nếu bạn đọc mã, bạn có thể thấy cách tôi triển khai điều này (bằng cách xóa một số CGContextAddArc
lệnh gọi và xóa một số giá trị bán kính trong mã. Mã cho tất cả các góc ở đó, vì vậy hãy sử dụng nó làm điểm bắt đầu và xóa phần tạo góc bạn không cần. Lưu ý rằng bạn cũng có thể tạo hình chữ nhật với 2 hoặc 3 góc tròn nếu muốn.
Mã không hoàn hảo, nhưng tôi chắc rằng bạn có thể chỉnh sửa nó một chút.
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float radius, int roundedCornerPosition)
{
// all corners rounded
// CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
// CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
// CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius,
// radius, M_PI / 4, M_PI / 2, 1);
// CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius,
// rect.origin.y + rect.size.height);
// CGContextAddArc(context, rect.origin.x + rect.size.width - radius,
// rect.origin.y + rect.size.height - radius, radius, M_PI / 2, 0.0f, 1);
// CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius);
// CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius,
// radius, 0.0f, -M_PI / 2, 1);
// CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
// CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius,
// -M_PI / 2, M_PI, 1);
// top left
if (roundedCornerPosition == 1) {
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius,
radius, M_PI / 4, M_PI / 2, 1);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
}
// bottom left
if (roundedCornerPosition == 2) {
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width,
rect.origin.y + rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius,
-M_PI / 2, M_PI, 1);
}
// add the other corners here
CGContextClosePath(context);
CGContextRestoreGState(context);
}
-(UIImage *)setImage
{
UIImage *img = [UIImage imageNamed:@"my_image.png"];
int w = img.size.width;
int h = img.size.height;
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(NULL, w, h, 8, 4 * w, colorSpace, kCGImageAlphaPremultipliedFirst);
CGContextBeginPath(context);
CGRect rect = CGRectMake(0, 0, w, h);
addRoundedRectToPath(context, rect, 50, 1);
CGContextClosePath(context);
CGContextClip(context);
CGContextDrawImage(context, rect, img.CGImage);
CGImageRef imageMasked = CGBitmapContextCreateImage(context);
CGContextRelease(context);
CGColorSpaceRelease(colorSpace);
[img release];
return [UIImage imageWithCGImage:imageMasked];
}
văn bản thay thế http://nevan.net/skitch/skitched-20100224-092237.png
Đừng quên rằng bạn sẽ cần phải có khung QuartzCore ở đó để điều này hoạt động.