透明なライトホールビュー、ビューオーバーレイスーパービュー、カバービューにホールグラディエントラウンドビューがあり、スーパービューはまだ可視です。 私はカバーを追加しようと誰もが放射状のグラデーションを持つビューを切り取る方法
EDIT ============
私を助けることができ、勾配光穴ビューを実装する見当がつかないカバービューの背景色はクリアで、カバレッジビューレイヤーにカスタムCALayerをサブレイヤとして追加します。
カバービュー実装:
@implementationのCoverView
- (instancetype)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
self.backgroundColor = [UIColor clearColor];
}
return self;
}
- (void)setGradientHoleFrame:(CGRect)gradientHoleFrame {
if (!CGRectEqualToRect(_gradientHoleFrame, gradientHoleFrame)) {
_gradientHoleFrame = gradientHoleFrame;
[self loadRadialGradientLayer];
}
}
- (void)loadRadialGradientLayer {
RadialGradientLayer *layer = [[RadialGradientLayer alloc] init];
layer.frame = self.bounds;
layer.raidalGradientFrame = self.gradientHoleFrame;
[layer setNeedsDisplay];
[self.layer addSublayer:layer];
}
@end
カスタムラジアル層:
CGFloat const GRADIENT_WIDTH = 10.0f;
@implementation RadialGradientLayer
- (void)setRaidalGradientFrame:(CGRect)raidalGradientFrame {
if (!CGRectEqualToRect(_raidalGradientFrame, raidalGradientFrame)) {
_raidalGradientFrame = raidalGradientFrame;
[self setNeedsDisplay];
}
}
- (void)drawInContext:(CGContextRef)context {
CGContextSaveGState(context);
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGFloat colours[8] = { 0.0f, 0.0f, 0.0f, 0.0f, // Clear region colour.
0.0f, 0.0f, 0.0f, 0.8 }; // Blur region colour.
CGFloat locations[2] = { 0.0f, 1.0f };
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, colours, locations, 2);
CGPoint center = CGPointMake(self.raidalGradientFrame.origin.x + self.raidalGradientFrame.size.width/2,
self.raidalGradientFrame.origin.y + self.raidalGradientFrame.size.height/2);
CGFloat radius = MIN(self.raidalGradientFrame.size.width/2, self.raidalGradientFrame.size.height/2) + GRADIENT_WIDTH;
CGContextDrawRadialGradient(context, gradient, center, 0.0, center, radius, kCGGradientDrawsAfterEndLocation);
CGGradientRelease(gradient);
CGColorSpaceRelease(colorSpace);
}
@end
私のユーザーにそれを:
CoverView *view = [[CoverView alloc] initWithFrame:[UIScreen mainScreen].bounds];
// for get hole frame
CGRect rect = [self.coinPointView.superview convertRect:self.coinPointView.frame toView:view];
view.gradientHoleFrame = rect;
[self.tabBarController.view addSubview:view];
は最後に、私は以下の結果となりました。 @gbkと@mattため
おかげ
コードを投稿してもよろしいですか?私はiOS開発の新機能です。 – jacinzhang
あなたのコードを書くつもりはありません。あなたの質問は、「グラデーションライトホールビューを実装することは考えていません。私はそれを実装する方法のアイデアをあなたに与えました。穴や勾配、マスクなどのものは何百回もスタックオーバーフロー(私を含む)で説明されています。 – matt