CALayer
iOSでは、ビュー (実際には s) の合成モードを制御できません。
ここで考えられる最善の解決策は、両方のビューにclearColor
(またはnil
) 背景を残し、単一のビューを使用してCAShapeLayer
両方の背景を描画することです。2 つのビューが同じ親を持つ場合、それほど難しくありません。
親がタイプであるとしましょうParentView
。でオーバーライドlayoutSubviews
しParentView
て、必要に応じて背景レイヤーを作成および更新します。setNeedsLayout
いずれかの子ビューを移動する場合は、必ず親ビューに送信してください。
ParentView.h
#import <UIKit/UIKit.h>
@interface ParentView : UIView
@property (nonatomic, strong) IBOutlet UIView *childView0;
@property (nonatomic, strong) IBOutlet UIView *childView1;
@end
ParentView.m
#import "ParentView.h"
@implementation ParentView {
CAShapeLayer *backdrop;
}
- (void)layoutSubviews {
[super layoutSubviews];
[self layoutBackdrop];
}
- (void)layoutBackdrop {
[self createBackdropIfNeeded];
[self arrangeBackdropBehindChildren];
[self setBackdropPath];
}
- (void)createBackdropIfNeeded {
if (backdrop == nil) {
backdrop = [CAShapeLayer layer];
backdrop.fillColor = [UIColor colorWithWhite:1 alpha:0.25].CGColor;
backdrop.fillRule = kCAFillRuleNonZero;
backdrop.strokeColor = nil;
}
}
- (void)arrangeBackdropBehindChildren {
[self.layer insertSublayer:backdrop atIndex:0];
}
- (void)setBackdropPath {
UIBezierPath *path = [UIBezierPath bezierPathWithRect:self.childView0.frame];
[path appendPath:[UIBezierPath bezierPathWithRect:self.childView1.frame]];
backdrop.path = path.CGPath;
}
@end