ฉันใช้คำตอบที่ได้ที่ฉันจะสร้าง UILabel มุมกลมบน iPhone ได้อย่างไร และรหัสจากมุมมองสี่เหลี่ยมผืนผ้าโค้งมนพร้อมความโปร่งใสทำบน iPhone ได้อย่างไร เพื่อสร้างรหัสนี้
จากนั้นฉันก็รู้ว่าฉันตอบคำถามผิด (ให้ UILabel กลมแทน UIImage) ดังนั้นฉันจึงใช้รหัสนี้เพื่อเปลี่ยน:
http://discussions.apple.com/thread.jspa?threadID=1683876
สร้างโปรเจ็กต์ iPhone ด้วยเทมเพลต View ในตัวควบคุมมุมมองให้เพิ่มสิ่งนี้:
- (void)viewDidLoad
{
CGRect rect = CGRectMake(10, 10, 200, 100);
MyView *myView = [[MyView alloc] initWithFrame:rect];
[self.view addSubview:myView];
[super viewDidLoad];
}
MyView
เป็นเพียงUIImageView
คลาสย่อย:
@interface MyView : UIImageView
{
}
ฉันไม่เคยใช้บริบทกราฟิกมาก่อน แต่ฉันสามารถรวบรวมโค้ดนี้ได้ ไม่มีรหัสสำหรับสองมุม หากคุณอ่านโค้ดคุณจะเห็นว่าฉันใช้งานสิ่งนี้อย่างไร (โดยการลบการCGContextAddArc
โทรบางส่วนและลบค่ารัศมีบางส่วนในโค้ดโค้ดสำหรับทุกมุมอยู่ที่นั่นดังนั้นใช้เป็นจุดเริ่มต้นและลบ ส่วนที่สร้างมุมที่คุณไม่ต้องการโปรดทราบว่าคุณสามารถสร้างรูปสี่เหลี่ยมผืนผ้าที่มีมุมมน 2 หรือ 3 มุมได้เช่นกันหากคุณต้องการ
รหัสไม่สมบูรณ์ แต่ฉันแน่ใจว่าคุณสามารถจัดระเบียบได้เล็กน้อย
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];
}
ข้อความแสดงแทน http://nevan.net/skitch/skitched-20100224-092237.png
อย่าลืมว่าคุณจะต้องได้รับเฟรมเวิร์ก QuartzCore เพื่อให้ใช้งานได้