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
(標題裡說繪製上面的2個角只是一種說法,其實想繪幾個就繪幾個。其實上面這一步就實現了標題的問題,引數請自己研究)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;
完成這一步,如果想給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]];
-----如果大家有更好的方法請告訴我,謝謝--------