如果切4個圓角可以直接用view.layer.cornerRaidus這個屬性,需要設(shè)置layer.maskToBounds = YES;
一把沒問題,如果考慮離屏渲染啥的,圖片又大又多的話可能造成卡頓。可以用UIBezierPath和CAShapeLayer的組合定義mask來達(dá)到切圓角的目的,并且而可以指定其中的任意圓角。如下,指定了切左上和右上2個角。
如下,
UIBezierPath *cardImgPath = [UIBezierPath bezierPathWithRoundedRect: self.cardImgView.bounds byRoundingCorners:UIRectCornerTopRight | UIRectCornerTopLeft cornerRadii:CGSizeMake(5, 5)];
CAShapeLayer *cardLayer = [[CAShapeLayer alloc] init];
cardLayer.path = cardImgPath.CGPath;
self.cardImgView.layer.mask = cardLayer;
- 今天用xib自定義了一個view,像往常一樣,用上面的代碼去切圓角,發(fā)現(xiàn)無論設(shè)置指定的圓角,它只顯示左上角被切了,其余的角沒變化。
通過打印xib中子控件的坐標(biāo),發(fā)現(xiàn)size都不正常,沒和屏幕適配。而且就算把size設(shè)置小一些還是不起作用。
經(jīng)過思考xib和控制器的關(guān)系,在xib顯示到控制器顯示的時候,其實已經(jīng)存在了,xib的子控件大小還沒和屏幕適配。當(dāng)設(shè)置了xib的frame,通過autoLayout子控件才顯示正常。這才看起來正常了。
所以,在xib加載的時候它需要自動調(diào)整才能適配屏幕,autoLayout的時候去切圓角,frame不是確定的,它就沒法去切其他的角了。
所以,指定確定frame就可以了。
經(jīng)過上面的一波分析,解決辦法就是直接指定rect,不使用view.bounds,如下:
UIBezierPath *cardImgPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0, 0, size.width, size.height) byRoundingCorners:UIRectCornerTopRight | UIRectCornerTopLeft cornerRadii:CGSizeMake(5, 5)];
PS:這個size是在設(shè)置xib的frame后計算的。根據(jù)自己的實際需求計算size。