重叠的透明 UIView

Posted

技术标签:

【中文标题】重叠的透明 UIView【英文标题】:Overlapping transparent UIViews 【发布时间】:2014-12-09 11:15:10 【问题描述】:

我用 25% 不透明度的白色 backgroundColor 覆盖两个 UIView。在一小部分中,它们相互重叠,这意味着在该区域,它们的总和为 50% 的不透明度。

我想保持 25% 的不透明度,即使两个视图重叠,这实际上意味着在这些重叠点中,每个视图的不透明度下降到 12.5%,总计 25%。

我对合成做了一些研究,但我不确定这些模式中的哪一种会有所帮助,或者我将如何将它们应用于这两个 UIView 实例的特定部分。

(http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html 是我正在阅读的内容,我找到了用于绘图的 CGBlendMode,如果涉及到使用它(尽管我宁愿不这样做!)

【问题讨论】:

【参考方案1】:

您无法在 ios 上控制视图的合成模式(或者,实际上,CALayers)。

我能想到的最佳解决方案是让两个视图都使用clearColor(或nil)背景,并使用单个CAShapeLayer 来绘制两者的背景。如果您的两个视图具有相同的父级,那就不太难了。

假设父对象的类型为ParentView。覆盖ParentView 中的layoutSubviews 以根据需要创建和更新背景层。如果您移动任一子视图,请务必将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

【讨论】:

【参考方案2】:

如果您将它们都添加到同一个父级UIView,告诉UIView 进行光栅化,然后在父级上设置 alpha,您将获得所需的效果。我不确定这是否符合您的显示结构或性能需求。

UIView *parent = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)];
[parent setBackgroundColor:[UIColor clearColor]];
[parent.layer setShouldRasterize:YES];
[parent.layer setRasterizationScale:[[UIScreen mainScreen] scale]];
[parent setAlpha:0.25];
UIView *subview1 = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 125, 125)];
[subview1 setBackgroundColor:[UIColor whiteColor]];
[parent addSubview:subview1];
UIView *subview2 = [[UIView alloc] initWithFrame:CGRectMake(75, 75, 125, 125)];
[subview2 setBackgroundColor:[UIColor whiteColor]];
[parent addSubview:subview2];

【讨论】:

您假设他想要在 alpha 0.25 处查看视图的全部内容,但这与仅在 alpha 0.25 处拥有 backgroundColor 不同。 实际上,我的意思是他可以只添加背景,然后将内容(以不同的层次结构)与背景同步。

以上是关于重叠的透明 UIView的主要内容,如果未能解决你的问题,请参考以下文章

防止 UIView 重叠

多个 UIView 的重叠

与其他 UIView 边框线重叠时的 UIView 边框线粗细

带有自定义 UIView 的 Tableview,添加标签重叠

重叠的 UIView - 如何接收触摸?

UIView 在 cellForRowAtIndexPath 中重叠/再次创建