在我的iPad應用程序中,當用戶單擊按鈕時,我希望第二個視圖出現在主視圖中。新視圖將比第一個視圖小,並在顯示時使背景變暗。我希望新視圖的頂部兩個角落看起來四捨五入,但是使用cornerRadius將所有角落都設爲四捨五入。我怎樣才能讓兩個角落四捨五入?只有兩個圓角?
Q
只有兩個圓角?
18
A
回答
17
你必須在drawRect中做到這一點。其實,我修改了經典addRoundedRectToPath:所以,它需要一個位圖,使棱角變圓您請求:
static void addRoundedRectToPath(CGContextRef context, CGRect rect, float radius, UIImageRoundedCorner cornerMask)
{
CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius);
if (cornerMask & UIImageRoundedCornerTopLeft) {
CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius,
radius, M_PI, M_PI/2, 1);
}
else {
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y + rect.size.height);
}
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius,
rect.origin.y + rect.size.height);
if (cornerMask & UIImageRoundedCornerTopRight) {
CGContextAddArc(context, rect.origin.x + rect.size.width - radius,
rect.origin.y + rect.size.height - radius, radius, M_PI/2, 0.0f, 1);
}
else {
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + rect.size.height);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + rect.size.height - radius);
}
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius);
if (cornerMask & UIImageRoundedCornerBottomRight) {
CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius,
radius, 0.0f, -M_PI/2, 1);
}
else {
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, rect.origin.y);
}
CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y);
if (cornerMask & UIImageRoundedCornerBottomLeft) {
CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius,
-M_PI/2, M_PI, 1);
}
else {
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + radius);
}
CGContextClosePath(context);
}
這需要一個位掩碼(我把它叫做UIImageRoundedCorner,因爲我是做這行的圖像,但你可以把它叫做什麼),然後建立一個基於你想四捨五入的角的路徑。然後,您應用路徑視圖的drawRect:
CGContextBeginPath(context);
addRoundedRectToPath(context, rect, radius, yourMask);
CGContextClosePath(context);
CGContextClip(context);
正如我所說的,我是做這行UIImages所以我的代碼是不完全建立在drawRect中使用:,但它應該是很容易以適應它。你基本上只是建立一條路徑,然後剪切它的上下文。
編輯:爲了解釋位掩碼的一部分,它只是一個枚舉:
typedef enum {
UIImageRoundedCornerTopLeft = 1,
UIImageRoundedCornerTopRight = 1 << 1,
UIImageRoundedCornerBottomRight = 1 << 2,
UIImageRoundedCornerBottomLeft = 1 << 3
} UIImageRoundedCorner;
這樣,您就能夠或東西放在一起,形成標識角位掩碼,因爲枚舉的每個成員代表位掩碼中兩個不同的冪。
很久以後編輯: 我發現一個簡單的方法來做到這一點使用UIBezierPath
的bezierPathWithRoundedRect:byRoundingCorners:cornerRadii:
。只需在您的上下文中使用bezier路徑對象的CGPath
即可。
56
// Create the path (with only the top-left corner rounded)
UIBezierPath *maskPath = [UIBezierPath bezierPathWithRoundedRect:imageView.bounds
byRoundingCorners:UIRectCornerTopLeft| UIRectCornerTopRight
cornerRadii:CGSizeMake(10.0, 10.0)];
// Create the shape layer and set its path
CAShapeLayer *maskLayer = [CAShapeLayer layer];
maskLayer.frame = imageView.bounds;
maskLayer.path = maskPath.CGPath;
// Set the newly created shape layer as the mask for the image view's layer
imageView.layer.mask = maskLayer;
這是其他使用頂部圓角。 Round two corners in UIView
8
由TomekKuźma完成的精彩工作。這是您的要求的新TKRoundedView類。
您的要求只能通過此參數來滿足。
TKRoundedView *view = [[TKRoundedView alloc] initWithFrame:frame];
view.roundedCorners = TKRoundedCornerTopLeft | TKRoundedCornerTopRight;
但它還提供了以下額外功能。
TKRoundedView *view = [[TKRoundedView alloc] initWithFrame:frame];
view.roundedCorners = TKRoundedCornerTopLeft
view.borderColor = [UIColor greenColor];
view.fillColor = [UIColor whiteColor];
view.drawnBordersSides = TKDrawnBorderSidesLeft | TKDrawnBorderSidesTop;
view.borderWidth = 5.0f;
view.cornerRadius = 15.0f;
請結帳以下鏈接示例項目
https://github.com/mapedd/TKRoundedView
相關問題
- 1. Silverlight xaml c中只有兩個圓角的圖像#
- 2. 只有一個Li元素的圓角?
- 3. UINavigationBar的兩個圓角
- 4. UINavigationBar圓角的兩個角落
- 5. 只有一邊有圓角邊框java
- 6. 圓角只有一個桌面的底角
- 7. Java - 在JFrame上只顯示兩個圓角
- 8. 如何在android中只創建兩個邊緣圓角的textView?
- 9. 有沒有辦法在UIButton上只有一個圓角?
- 10. 圓角圖像只有某些角落與calayer的角落Radius
- 11. 可可 - NSTextField只有左上角和左下角的圓角
- 12. 圓角只爲UITableView的
- 13. 圓角只在頂部
- 14. 圓角圓角?
- 15. 連續兩個圓角邊框?
- 16. ios中兩個標籤的圓角
- 17. 兩個EditText領域與圓角cornors android
- 18. 創建一個只有兩個圓邊的矩形形狀
- 19. 兩個TextViews並排,只有一個橢圓?
- 20. 只有一個圓角和漸變背景的VBox
- 21. 圖像圓角半徑只有左下角和右側
- 22. 如何使一個圓矩形按鈕有兩個圓角和兩個矩形邊緣
- 23. Java - 繪製具有兩個圓角的矩形
- 24. UIAlertView沒有圓角
- 25. IE7 +圓角有jQueryUI
- 26. 帶有單個圓角的UIButton
- 27. 將一個CAShapeLayer圓動畫成一個圓角三角形
- 28. 圓角DataGrid角?
- 29. WPF矩形 - 只是頂部圓角
- 30. 每個UITableView部分有多個圓角轉角行
偉大的答案!只需要它幫助實施它。首先,我該如何製作自己的位掩碼? – Jumhyn 2011-01-30 20:32:42
編輯解釋枚舉的答案。 – kevboh 2011-01-30 21:56:40
我的答案是建立你想要四捨五入的任何角落。如果你只需要頂部兩個角落而不關心其他角落,你可以編輯位掩碼廢話,並使用對應於你需要四捨五入的角落的兩個部分。 – kevboh 2011-01-30 22:02:51