สำหรับใครก็ตามที่สงสัยว่าจะวาดเงาภายในโดยใช้ Core Graphics ได้อย่างไรตามคำแนะนำของ Costique นี่คือวิธี: (บน iOS ปรับได้ตามต้องการ)
ใน drawRect ของคุณ: วิธีการ ...
CGRect bounds = [self bounds];
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = 0.5f * CGRectGetHeight(bounds);
CGMutablePathRef visiblePath = CGPathCreateMutable();
CGRect innerRect = CGRectInset(bounds, radius, radius);
CGPathMoveToPoint(visiblePath, NULL, innerRect.origin.x, bounds.origin.y);
CGPathAddLineToPoint(visiblePath, NULL, innerRect.origin.x + innerRect.size.width, bounds.origin.y);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, bounds.origin.y, bounds.origin.x + bounds.size.width, innerRect.origin.y, radius);
CGPathAddLineToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, innerRect.origin.y + innerRect.size.height);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x + bounds.size.width, bounds.origin.y + bounds.size.height, innerRect.origin.x + innerRect.size.width, bounds.origin.y + bounds.size.height, radius);
CGPathAddLineToPoint(visiblePath, NULL, innerRect.origin.x, bounds.origin.y + bounds.size.height);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x, bounds.origin.y + bounds.size.height, bounds.origin.x, innerRect.origin.y + innerRect.size.height, radius);
CGPathAddLineToPoint(visiblePath, NULL, bounds.origin.x, innerRect.origin.y);
CGPathAddArcToPoint(visiblePath, NULL, bounds.origin.x, bounds.origin.y, innerRect.origin.x, bounds.origin.y, radius);
CGPathCloseSubpath(visiblePath);
UIColor *aColor = [UIColor redColor];
[aColor setFill];
CGContextAddPath(context, visiblePath);
CGContextFillPath(context);
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, CGRectInset(bounds, -42, -42));
CGPathAddPath(path, NULL, visiblePath);
CGPathCloseSubpath(path);
CGContextAddPath(context, visiblePath);
CGContextClip(context);
aColor = [UIColor colorWithRed:0.0f green:0.0f blue:0.0f alpha:0.5f];
CGContextSaveGState(context);
CGContextSetShadowWithColor(context, CGSizeMake(0.0f, 1.0f), 3.0f, [aColor CGColor]);
[aColor setFill];
CGContextSaveGState(context);
CGContextAddPath(context, path);
CGContextEOFillPath(context);
CGPathRelease(path);
CGPathRelease(visiblePath);
ดังนั้นโดยพื้นฐานแล้วมีขั้นตอนต่อไปนี้:
- สร้างเส้นทางของคุณ
- กำหนดสีเติมที่คุณต้องการเพิ่มเส้นทางนี้ไปยังบริบทและเติมบริบท
- ตอนนี้สร้างสี่เหลี่ยมผืนผ้าที่ใหญ่ขึ้นซึ่งสามารถผูกเส้นทางที่มองเห็นได้ ก่อนปิดเส้นทางนี้ให้เพิ่มเส้นทางที่มองเห็นได้ จากนั้นปิดเส้นทางเพื่อให้คุณสร้างรูปร่างโดยลบเส้นทางที่มองเห็นออกจากมัน คุณอาจต้องการตรวจสอบวิธีการเติม (การคดเคี้ยวที่ไม่ใช่ศูนย์ของคู่ / คี่) ขึ้นอยู่กับว่าคุณสร้างเส้นทางเหล่านี้อย่างไร โดยพื้นฐานแล้วในการทำให้ subpaths เป็น "ลบ" เมื่อคุณรวมเข้าด้วยกันคุณจะต้องวาด (หรือสร้างมากกว่านั้น) ในทิศทางตรงกันข้ามตามเข็มนาฬิกาและอีกทางหนึ่งทวนเข็มนาฬิกา
- จากนั้นคุณต้องตั้งค่าเส้นทางที่มองเห็นของคุณเป็นเส้นทางการตัดบนบริบทเพื่อที่คุณจะได้ไม่วาดอะไรออกไปนอกหน้าจอ
- จากนั้นตั้งค่าเงาบนบริบทซึ่งรวมถึงออฟเซ็ตเบลอและสี
- จากนั้นเติมรูปทรงที่ใหญ่ด้วยรูเข้าไป สีไม่สำคัญเพราะถ้าคุณทำทุกอย่างถูกต้องคุณจะไม่เห็นสีนี้เป็นเพียงเงา