Costique önerisine göre Core Graphics kullanarak nasıl iç gölge çizileceğini merak eden herkes için, o zaman şu şekilde: (iOS'ta gerektiği gibi ayarlayın)
DrawRect'inizde: yöntem ...
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);
Yani, esasen aşağıdaki adımlar vardır:
- Yolunuzu oluşturun
- İstediğiniz dolgu rengini ayarlayın, bu yolu bağlama ekleyin ve bağlamı doldurun
- Şimdi, görünür yolu sınırlayabilen daha büyük bir dikdörtgen oluşturun. Bu yolu kapatmadan önce görünen yolu ekleyin. Ardından yolu kapatın, böylece ondan çıkarılmış görünür yolla bir şekil oluşturun. Bu yolları nasıl oluşturduğunuza bağlı olarak dolgu yöntemlerini (çift / tek için sıfır olmayan sargı) araştırmak isteyebilirsiniz. Esasen, alt yolları birbirine eklediğinizde "çıkarılmasını" sağlamak için, onları zıt yönlerde, biri saat yönünde ve diğeri saat yönünün tersine çizmeniz (veya daha doğrusu inşa etmeniz) gerekir.
- Ardından, görünür yolunuzu bağlamda kırpma yolu olarak ayarlamanız gerekir, böylece ekranın dışına hiçbir şey çizmezsiniz.
- Ardından, dengeleme, bulanıklık ve rengi içeren bağlamda gölgeyi ayarlayın.
- Sonra büyük şekli içindeki delikle doldurun. Renk önemli değil, çünkü her şeyi doğru yaptıysanız, bu rengi göremezsiniz, sadece gölgeyi.