iOS开发过程中建议使用insertSubView和insertSublayer来替代addSubview与addSublayer

1.主旨:如题

2.目的:
a.更好的控制试图的层级关系
b.减少遇到一些特殊情况出现bug的几率

3.事例: 使用渐变的代码和添加imageView的IB

- (void)viewDidLoad{   
 /**     *  情况1:addSublayer     */   
 [self.view.layer addSublayer:[self shadowAsInverse]];          
  /**     *  情况2:insertSublayer     */   
 [self.view.layer insertSublayer:[self shadowAsInverse] atIndex:0];
} 
- (CAGradientLayer *)shadowAsInverse;
{    
CAGradientLayer *newShadow = [[CAGradientLayer alloc] init];    CGRect newShadowFrame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);    newShadow.frame = newShadowFrame;   
 //添加渐变的颜色组合    
newShadow.colors = [NSArray arrayWithObjects:(id)[UIColor colorWithHexString:@"333333"].CGColor,
(id)[UIColor colorWithHexString:@"8100E8"].CGColor,nil];    
return newShadow;
}

情况一


iOS开发过程中建议使用insertSubView和insertSublayer来替代addSubview与addSublayer_第1张图片
20141107152631531.png

情况二


iOS开发过程中建议使用insertSubView和insertSublayer来替代addSubview与addSublayer_第2张图片
20141107152600481.png

出现两种不同情况的原因,在于渐变的方法:
其实这个方法是在layer上面添加了layer所以新添加的layer覆盖掉了self.view上的内容,也就是IB上面添加的图片!
而方法二,设置layer插入的位置为0,也就是图层的最底层,所以方法二IB上面设置的iamgeView能正常显示!

注意:

UIView的addSubView的原理是:把子view的layer加载到父view的layer上,如果你用addSubViewLayer的方法给父view加Layer,就会覆盖掉子view的layer,所以父view中的子view会看不见,如果用 [self.view.layer insertSublayer:[self shadowAsInverse] atIndex0 可以把layer加载到父view的layer的底层,就会看到这个效果

你可能感兴趣的:(iOS开发过程中建议使用insertSubView和insertSublayer来替代addSubview与addSublayer)