CALayer的masking显示
chuanqicc
8年前
<p>来自: <a href="/misc/goto?guid=4959670310641768598" rel="nofollow">http://shellcodes.sinaapp.com/articles/526</a></p> <p>CALayer有一个BOOL属性值是masksToBounds,当这个值为TRUE时,他的superLayer中的内容会根据bounds值进行裁剪,也就是说在bounds内的内容会显示,否则不显示,配合着CALayer的cornerRadius则可以完成诸如圆角之类的效果。</p> <p>但有时仅仅圆角的效果是不够用的,因为这些算事在rect效果上的一些小修改,如果有别的需求,比如一个五角星的相片框,只用上面两个值是无法实现的。</p> <p>在这种情况下,CALayer的mask就有用了。CALayer的mask属性也是一个CALayer,如果我们给这个CALayer赋值为一张PNG的图片,则UIKit会计算出这个PNG图片的边缘区域,结果就是所有在这个区域内的内容会显示,否则不显示。</p> <p>当我们使用如下代码时,会在屏幕中央显示一个黑色的图片</p> <pre> <code class="language-objectivec">UIImage *image = [UIImage imageNamed:@"Black"]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; imageView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); imageView.image = image; [self.view addSubview:imageView];</code></pre> <p>如下</p> <p><img src="https://simg.open-open.com/show/c2a0132d781ccef262ec43f31881b730.png"></p> <p>如果我们加上一个五角星的maskLayer,就完成了我们需要的那种五角星边框效果,修改后的代码如下</p> <pre> <code class="language-objectivec">- (void)drawMaskedImage { UIImage *image = [UIImage imageNamed:@"Black"]; UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 200, 200)]; imageView.center = CGPointMake(CGRectGetMidX(self.view.bounds), CGRectGetMidY(self.view.bounds)); imageView.image = image; [self.view addSubview:imageView]; CALayer *maskLayer = [[CALayer alloc] init]; maskLayer.frame = imageView.bounds; UIImage *maskImage = [UIImage imageNamed:@"Star"]; maskLayer.contents = (__bridge id _Nullable)(maskImage.CGImage); imageView.layer.mask = maskLayer; }</code></pre> <p>效果呢,就是刚才所说的那种</p> <p><img src="https://simg.open-open.com/show/cdf4fefc18d6b53d8a81edd7cd48978b.png"></p>