CALayer的masking顯示

chuanqicc 8年前發布 | 7K 次閱讀 CALayer iOS開發 移動開發

來自: http://shellcodes.sinaapp.com/articles/526

CALayer有一個BOOL屬性值是masksToBounds,當這個值為TRUE時,他的superLayer中的內容會根據bounds值進行裁剪,也就是說在bounds內的內容會顯示,否則不顯示,配合著CALayer的cornerRadius則可以完成諸如圓角之類的效果。

但有時僅僅圓角的效果是不夠用的,因為這些算事在rect效果上的一些小修改,如果有別的需求,比如一個五角星的相片框,只用上面兩個值是無法實現的。

在這種情況下,CALayer的mask就有用了。CALayer的mask屬性也是一個CALayer,如果我們給這個CALayer賦值為一張PNG的圖片,則UIKit會計算出這個PNG圖片的邊緣區域,結果就是所有在這個區域內的內容會顯示,否則不顯示。

當我們使用如下代碼時,會在屏幕中央顯示一個黑色的圖片

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];

如下

如果我們加上一個五角星的maskLayer,就完成了我們需要的那種五角星邊框效果,修改后的代碼如下

- (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;
}

效果呢,就是剛才所說的那種

 本文由用戶 chuanqicc 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!