0

backgroundColor不透明度 25%の白で 2 つの UIView を重ねています。小さな部分では、それらは互いに重なり合っています。つまり、その領域では合計して 50% の不透明度になります。

2 つのビューが重なったとしても、25% の不透明度を維持したいと思います。つまり、これらの重なったポイントでは、各ビューの不透明度が 12.5% に下がり、合計で 25% になります。

UIView合成について少し調べてみましたが、これらのモードのどれが役立つか、またはこれら 2 つのインスタンスの特定の部分にどのように適用するかはわかりません。

( http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.htmlは私が読んでいたものCGBlendModeで、それを使用する場合は描画用を見つけました(ただし、可能!))

4

2 に答える 2

1

CALayeriOSでは、ビュー (実際には s) の合成モードを制御できません。

ここで考えられる最善の解決策は、両方のビューにclearColor(またはnil) 背景を残し、単一のビューを使用してCAShapeLayer両方の背景を描画することです。2 つのビューが同じ親を持つ場合、それほど難しくありません。

親がタイプであるとしましょうParentView。でオーバーライドlayoutSubviewsParentViewて、必要に応じて背景レイヤーを作成および更新します。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
于 2014-10-14T15:55:50.073 に答える