Bagi orang lain yang bertanya-tanya bagaimana cara menggambar bayangan dalam menggunakan Core Graphics sesuai saran Costique, maka begini caranya: (di iOS sesuaikan sesuai kebutuhan)
Dalam metode drawRect: ...
CGRect bounds = [self bounds];
CGContextRef context = UIGraphicsGetCurrentContext();
CGFloat radius = 0.5f * CGRectGetHeight(bounds);
// Create the "visible" path, which will be the shape that gets the inner shadow
// In this case it's just a rounded rect, but could be as complex as your want
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);
// Fill this path
UIColor *aColor = [UIColor redColor];
[aColor setFill];
CGContextAddPath(context, visiblePath);
CGContextFillPath(context);
// Now create a larger rectangle, which we're going to subtract the visible path from
// and apply a shadow
CGMutablePathRef path = CGPathCreateMutable();
//(when drawing the shadow for a path whichs bounding box is not known pass "CGPathGetPathBoundingBox(visiblePath)" instead of "bounds" in the following line:)
//-42 cuould just be any offset > 0
CGPathAddRect(path, NULL, CGRectInset(bounds, -42, -42));
// Add the visible path (so that it gets subtracted for the shadow)
CGPathAddPath(path, NULL, visiblePath);
CGPathCloseSubpath(path);
// Add the visible paths as the clipping path to the context
CGContextAddPath(context, visiblePath);
CGContextClip(context);
// Now setup the shadow properties on the 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]);
// Now fill the rectangle, so the shadow gets drawn
[aColor setFill];
CGContextSaveGState(context);
CGContextAddPath(context, path);
CGContextEOFillPath(context);
// Release the paths
CGPathRelease(path);
CGPathRelease(visiblePath);
Jadi, intinya ada langkah-langkah berikut:
- Ciptakan jalan Anda
- Atur warna isian yang Anda inginkan, tambahkan jalur ini ke konteks, dan isi konteksnya
- Sekarang buat persegi panjang yang lebih besar yang dapat mengikat jalur yang terlihat. Sebelum menutup jalur ini, tambahkan jalur yang terlihat. Kemudian tutup jalurnya, sehingga Anda membuat bentuk dengan jalur yang terlihat dikurangi darinya. Anda mungkin ingin menyelidiki metode pengisian (belitan genap / ganjil bukan nol) bergantung pada cara Anda membuat jalur ini. Intinya, untuk mendapatkan subpath untuk "mengurangi" saat Anda menjumlahkannya, Anda perlu menggambarnya (atau lebih tepatnya membangunnya) ke arah yang berlawanan, satu searah jarum jam dan yang lainnya berlawanan arah jarum jam.
- Kemudian Anda perlu mengatur jalur yang terlihat sebagai jalur kliping pada konteks, sehingga Anda tidak menggambar apa pun di luarnya ke layar.
- Kemudian atur bayangan pada konteksnya, yang mencakup offset, blur, dan warna.
- Kemudian isi bentuk besar dengan lubang di dalamnya. Warnanya tidak masalah, karena jika Anda melakukan semuanya dengan benar, Anda tidak akan melihat warna ini, hanya bayangannya.