2011-01-30 73 views
18

在我的iPad應用程序中,當用戶單擊按鈕時,我希望第二個視圖出現在主視圖中。新視圖將比第一個視圖小,並在顯示時使背景變暗。我希望新視圖的頂部兩個角落看起來四捨五入,但是使用cornerRadius將所有角落都設爲四捨五入。我怎樣才能讓兩個角落四捨五入?只有兩個圓角?

回答

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; 

這樣,您就能夠或東西放在一起,形成標識角位掩碼,因爲枚舉的每個成員代表位掩碼中兩個不同的冪。

很久以後編輯: 我發現一個簡單的方法來做到這一點使用UIBezierPathbezierPathWithRoundedRect:byRoundingCorners:cornerRadii:。只需在您的上下文中使用bezier路徑對象的CGPath即可。

+0

偉大的答案!只需要它幫助實施它。首先,我該如何製作自己的位掩碼? – Jumhyn 2011-01-30 20:32:42

+0

編輯解釋枚舉的答案。 – kevboh 2011-01-30 21:56:40

+0

我的答案是建立你想要四捨五入的任何角落。如果你只需要頂部兩個角落而不關心其他角落,你可以編輯位掩碼廢話,並使用對應於你需要四捨五入的角落的兩個部分。 – kevboh 2011-01-30 22:02:51

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