1. 程式人生 > >IOS如何給VIEW設定2個圓角?set cornerRadius for only top-left and top-right corner of a UIVIEW

IOS如何給VIEW設定2個圓角?set cornerRadius for only top-left and top-right corner of a UIVIEW

-----如果大家有更好的方法請告訴我,謝謝--------

有些設計中,需要實現top-left和top-right為圓角,而bottom-left and bottom-right依然是平角,這樣就不能使用

_bg.layer.cornerRadius

了。

這裡要用到一些基本的繪製功能UIBezierPath and CAShapeLayer

-----------

這裡先看看最終效果圖


注意上面的大白塊,top-left and top-right是圓角,bottom-left and bottom-right是平角,然後有一個border color;

實現的具體步驟如下(給大白塊定義為_bg):

一、定義一個貝賽爾曲線,作為路徑繪製給_bg

UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:_bg.bounds
                                     byRoundingCorners:(UIRectCornerTopLeft|UIRectCornerTopRight)
                                           cornerRadii:CGSizeMake(10.0, 10.0)];
//    (UIRectCornerBottomLeft|UIRectCornerBottomRight)
    
CAShapeLayer *maskLayer = [[CAShapeLayer alloc] init];
maskLayer.path = maskPath.CGPath;
_bg.layer.mask = maskLayer;
(標題裡說繪製上面的2個角只是一種說法,其實想繪幾個就繪幾個。其實上面這一步就實現了標題的問題,引數請自己研究)

完成這一步,如果想給UIView新增borderColor and borderWidth,會發現,UIView直線處成功有了線條,但是曲線(圓角)並沒有線條的出現,所以就有了接下的內容。

二、建立一個UIView,用來繪製展現border的,然後覆蓋在_bg上面,實現borderColor的效果

UIView *strokeView = [[UIView alloc] initWithFrame:_bg.bounds];
strokeView.tag = 99;
_bg.userInteractionEnabled = NO;

注1:為什麼要設定tag

注2:為什麼要新建一個UIView

三、為storkeView繪製邊線

CAShapeLayer *strokeLayer = [CAShapeLayer layer];
strokeLayer.path = maskPath.CGPath;
strokeLayer.fillColor = [UIColor clearColor].CGColor; //內容填充的顏色設定為clear
strokeLayer.strokeColor = [UIColor colorWithHexString:@"#e0e0e0"].CGColor; //邊色
strokeLayer.lineWidth = 1; // 邊寬
[strokeView.layer addSublayer:strokeLayer];
完成這一步,其實會發現,已經實現了在給_bg新增borderColor的效果;這裡解釋下注1和注;

注1:因為使用了AutoLayout,有時候不能確定_bg在不同裝置上最終的bounds ,所以像繪製的內容如果放在viewWillLayoutSubviews方法(或者多次繪製)時,在layout之前如果不小心觸發了繪製,那麼繪製的bounds可能是按照xib上設計的尺寸;這裡我建議就是設定一個tag,然後在每次繪製(觸發)前呼叫

[[_bg viewWithTag:99] removeFromSuperview];
方法來清除掉borderColor,防止繪製多個strokeView在_bg上面

注2:其實直接在_bg上繪製strokeLayer是可以的,但是如果_bg裡本身有內容的話,繪製因為是整個UIView繪製(不是隻繪一條線),所以會把子元素給抹掉,所以還是新建一個UIView比較好

-------那麼接下來,仔細看效果圖其實會發現,最下面的邊其實是沒有borderColor的,那如何抹掉呢?-------

四、在strokeView上建立一根白色的線,覆蓋下面的邊線,實現抹掉效果……

CALayer *bottomBorder = [CALayer layer];
bottomBorder.frame = CGRectMake(0.0f, strokeView.bounds.size.height-1.0f, strokeView.frame.size.width, 1.0f);
bottomBorder.backgroundColor = [UIColor whiteColor].CGColor;
[strokeView.layer addSublayer:bottomBorder];
這裡建立了一個圖層,Rect和strokeView下面的邊線的size\origin是一樣的,因為白色背景,所以圖層用白色,實現抹掉~

哦,最後記得把strokeView新增到_bg裡

[_bg addSubview:strokeView];

----如果_bg有子元素是需要觸發事件的,可以

[[_bg2 viewWithTag:99].superview sendSubviewToBack:[_bg2 viewWithTag:99]];


-----如果大家有更好的方法請告訴我,謝謝--------