【问题标题】:CALayer, subLayer alpha overridingCALayer, subLayer alpha 覆盖
【发布时间】:2013-03-29 17:34:18
【问题描述】:

我有一个具有 0.3 不透明度属性的 CALayer ( superlayer )。超层包含另一个 CALayer(子层)。虽然 sublayer 没有 opacity 属性 superLayer 的 opacity 会影响 sublayer 的外观。有没有一种方法可以覆盖 superLayer'a opacity 属性。

超级层

@implementation SuperView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setOpaque:NO];
        [self.layer setOpaque:NO];
    }
    return self;
}

-(void)drawRect:(CGRect)rect
{
    CALayer* superLaer=self.layer;

    superLaer.backgroundColor = [UIColor blackColor].CGColor;
    superLaer.shadowOffset = CGSizeMake(0, 3);
    superLaer.shadowRadius = 5.0;
    superLaer.shadowColor = [UIColor blackColor].CGColor;
    superLaer.shadowOpacity = 0.6;
    superLaer.frame = CGRectMake(10, 10, 300,300);
    superLaer.borderColor = [UIColor blackColor].CGColor;
    superLaer.borderWidth = 2.0;
    superLaer.cornerRadius = 10.0;
    superLaer.cornerRadius = 10.0;
    superLaer.masksToBounds=YES;
    superLaer.opacity = 0.1;
}

@end

子层

@implementation SubView

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        [self setOpaque:NO];
        [self.layer setOpaque:NO];
    }
    return self;

}

-(void)drawRect:(CGRect)rect
{
    CALayer* superLaer=self.layer;

    superLaer.backgroundColor = [UIColor redColor].CGColor;
    superLaer.shadowOffset = CGSizeMake(0, 3);
    superLaer.shadowRadius = 5.0;
    superLaer.shadowColor = [UIColor blackColor].CGColor;
    superLaer.shadowOpacity = 0.6;
    superLaer.frame = CGRectMake(100, 100, 100,100);
    superLaer.borderColor = [UIColor blackColor].CGColor;
    superLaer.borderWidth = 2.0;
    superLaer.cornerRadius = 10.0;
    superLaer.cornerRadius = 10.0;
    superLaer.masksToBounds=YES;
}

@end

我已经在 Viewcontroller 中将 subView 添加到 superView 中了。

【问题讨论】:

  • 你找到解决办法了吗?

标签: ios calayer opacity alpha quartz-2d


【解决方案1】:

根据您的问题,超级图层的不透明度控制子图层的不透明度, 你可以继承 CALayer 并在 init 方法中覆盖它的一些属性,比如

@implementation SomeSuperCALayer

-(id)init
{
    self = [super init];
    if (self) {
        [self setup];
    }
    return  self;
}


#define  W_H 100.0
#define X_Y 50.0f

-(void)setup
{
    self.frame = CGRectMake(X_Y, X_Y, W_H, W_H);
    self.backgroundColor = [UIColor blueColor].CGColor;
    self.opacity = 1.0f; // big opacity 
}

@implementation SomeSubCALayer

-(id)init
{
    self = [super init];
    if (self) {
        [self setup];
    }
    return  self;
}


#define  W_H 100.0
#define X_Y 150.0f

-(void)setup
{
    self.frame = CGRectMake(X_Y, X_Y, W_H, W_H);
    self.backgroundColor = [UIColor blueColor].CGColor;
    self.opacity = .5f; // small opacity 
}


@ implementation MyViewController


// 
-(void)viewDidLoad
{
SomeSuperCALayer *superLayer = [[SomeSuperCALayer alloc] init];        SomeSubCALayer *subLayer = [[SomeSubCALayer alloc] init];
//add sub layer to super layer 
[superLayer addSubLayer:subLayer]; 
// add super layer to main View
[self.view.layer addSubLayer:superLayer]; 
// 
//... 


}

也不要使用 drawRect 来调用图层的属性,drawRect 并不意味着像 Apple 的文档所指示的那样进行绘图: / 仅覆盖drawRect:如果您执行自定义绘图。 // 空实现会对动画期间的性能产生不利影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多