クリッピング マスクを使用してパスのストロークを切り取り、影だけを残して、丸みを帯びた四角形の内側にインセット シャドウを描画しようとしています。最終的な目標は、通知センター内の物事のはめ込みの外観に近づけることです。
私は失敗しています。CGContextClipToMask は単に機能していません。これは、プロジェクトの他の場所で同じ手法を使用しているため、特に腹立たしいことですが、そこでは正常に機能します。ここに私の描画コードがあります:
const CGFloat cornerRadius = 5.0f;
CGContextRef context = UIGraphicsGetCurrentContext();
// Draw background color
[[UIColor colorWithWhite:0.2 alpha:0.5] setFill];
UIBezierPath* background = [UIBezierPath bezierPathWithRoundedRect:self.bounds cornerRadius:cornerRadius];
[background fill];
// Draw the inner shadow
UIImage* mask;
UIGraphicsBeginImageContext(self.bounds.size);
{{
CGContextRef igc = UIGraphicsGetCurrentContext();
[[UIColor blackColor] setFill];
CGContextFillRect(igc, self.bounds);
// Inset the mask by a ridiculous degree just to be sure that it's working
UIBezierPath* insetMask = [UIBezierPath bezierPathWithRoundedRect:CGRectInset(self.bounds, 20, 20) cornerRadius:cornerRadius];
[[UIColor whiteColor] setFill];
[insetMask fill];
mask = UIGraphicsGetImageFromCurrentImageContext();
}}
UIGraphicsEndImageContext();
CGContextSaveGState(context);
{{
CGContextClipToMask(context, self.bounds, mask.CGImage);
[[UIColor whiteColor] setStroke];
CGContextSetShadow(context, CGSizeMake(0, 1), 1);
[background stroke];
}}
CGContextRestoreGState(context);
何が問題なのかを推測すると、ドキュメントに記載されている前提条件に何らかの形で違反していると言えます。
が画像の場合
mask
、それは DeviceGray 色空間にある必要があり、アルファ コンポーネントを持たない可能性があり、画像マスクまたはマスキング カラーによってマスクされない可能性があります。
ただし、これが事実であるかどうかを確認する方法はなく、そうである場合は修正することはできません。
あなたが提供できるどんな助けのためのTIA!
(iOS 6 を実行している iPhone 4S でアプリを実行しています。)