2009-06-23 34 views
39

当运行耗时的操作时,很多应用程序会弹出带圆角的透明视图和activityIndi​​cator。如何在iPhone上完成透明度的圆角矩形视图?

这个舍入是如何完成的,是否可以使用Interface Builder来完成(因为有很多地方我想使用类似的东西)?或者,我应该使用带有圆角矩形或可拉伸图像的图像视图吗?我需要自己画背景吗?

到目前为止,我已经设法通过在界面生成器中设置alphaValue来获得具有相似透明度的基本视图,但它没有圆角,并且透明度似乎适用于所有子视图(我不想文本和activityindicator是透明的,但是即使我在IB中设置alphaValue,它似乎被忽略)。

回答

47
view.layer.cornerRadius = radius; 

难的方法(即使用第一代iPhone SDK被必需)是与drawRect:方法创建自己的UIView子类:

CGContextRef context = UIGraphicsGetCurrentContext(); 
CGContextSetRGBFillColor(context, 0,0,0,0.75); 

CGContextMoveToPoint(context, rect.origin.x, rect.origin.y + radius); 
CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y + rect.size.height - radius); 
CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + rect.size.height - radius, 
       radius, M_PI, M_PI/2, 1); //STS fixed 
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width - radius, 
         rect.origin.y + rect.size.height); 
CGContextAddArc(context, rect.origin.x + rect.size.width - radius, 
       rect.origin.y + rect.size.height - radius, radius, M_PI/2, 0.0f, 1); 
CGContextAddLineToPoint(context, rect.origin.x + rect.size.width, rect.origin.y + radius); 
CGContextAddArc(context, rect.origin.x + rect.size.width - radius, rect.origin.y + radius, 
       radius, 0.0f, -M_PI/2, 1); 
CGContextAddLineToPoint(context, rect.origin.x + radius, rect.origin.y); 
CGContextAddArc(context, rect.origin.x + radius, rect.origin.y + radius, radius, 
       -M_PI/2, M_PI, 1); 

CGContextFillPath(context); 

注:rect在这段代码也应取自[self bounds](或者你想要的任何位置),rect传递给drawRect:方法就没有意义了。

+0

感谢我没有关闭的道路,万一!会尝试。 – frankodwyer 2009-06-23 11:23:19

+0

我是否仍然通过IB设置透明度和bg颜色等,如何停止alpha应用于子视图(text/activityIndi​​cator)?至少我认为这会发生 - 文本和微调看起来都很无聊/灰色,就像背景是通过白色文本。 – frankodwyer 2009-06-23 11:26:19

+0

在IB中设置透明背景,并在代码中使用半透明填充颜色。我已经更新了答案。 – Kornel 2009-06-23 11:28:50

7

您认为这样做是drawRect方法

float radius = 5.0f; 

CGRect rect = self.bounds; 
CGContextRef context = UIGraphicsGetCurrentContext(); 
rect = CGRectInset(rect, 1.0f, 1.0f); 

CGContextBeginPath(context); 
CGContextSetGrayFillColor(context, 0.5, 0.7); 
CGContextMoveToPoint(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect)); 
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMinY(rect) + radius, radius, 3 * M_PI/2, 0, 0); 
CGContextAddArc(context, CGRectGetMaxX(rect) - radius, CGRectGetMaxY(rect) - radius, radius, 0, M_PI/2, 0); 
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMaxY(rect) - radius, radius, M_PI/2, M_PI, 0); 
CGContextAddArc(context, CGRectGetMinX(rect) + radius, CGRectGetMinY(rect) + radius, radius, M_PI, 3 * M_PI/2, 0); 

CGContextClosePath(context); 
CGContextFillPath(context); 

这会让你的圆角矩形对你的看法。您可以在随SDK提供的HeadsUpUI示例中找到完整的示例。 HTH

79

从iPhone SDK 3.0开始,您可以简单地使用图层的cornerRadius属性。例如:

view.layer.cornerRadius = 10.0; 

按照同样的思路,您可以更改视图的边框颜色和宽度:

view.layer.borderColor = [[UIColor grayColor] CGColor]; 
view.layer.borderWidth = 1; 
8

我抽象出来@ lostInTransit的回应到此功能:

static void ContextAddRoundedRect(CGContextRef c, CGRect rect, CGFloat radius) { 
    CGFloat minX = CGRectGetMinX(rect); 
    CGFloat maxX = CGRectGetMaxX(rect); 
    CGFloat minY = CGRectGetMinY(rect); 
    CGFloat maxY = CGRectGetMaxY(rect); 

    CGContextMoveToPoint(c, minX + radius, minY); 
    CGContextAddArcToPoint(c, maxX, minY, maxX, minY + radius, radius); 
    CGContextAddArcToPoint(c, maxX, maxY, maxX - radius, maxY, radius); 
    CGContextAddArcToPoint(c, minX, maxY, minX, maxY - radius, radius); 
    CGContextAddArcToPoint(c, minX, minY, minX + radius, minY, radius); 
} 

其路径与放置到上下文为你做,因为你可能

略有不同CoreGraphics中调用,并且要补充一点,

CGContextFillPath(c); 
相关问题