如何在iphone上完成透明的rect视图?

当运行耗时的操作时,许多应用程序popup一个透明的圆angular视图和一个activityIndi​​cator。

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

到目前为止,通过在界面生成器中设置alphaValue,我设法得到了一个具有相似透明度的基本视图,但是它没有圆angular,透明度似乎也适用于所有子视图(我不想要文本和活动指示符是透明的,但是即使我在IB中设置alphaValue它似乎被忽略)。

view.layer.cornerRadius = radius; 

硬性的方法(以前在第一个iPhone SDK中是必需的)是用drawRect:方法创build你自己的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:方法是没有意义的。

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

 view.layer.cornerRadius = 10.0; 

沿着同样的路线,你可以改变视图的边框颜色和宽度:

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

我把@ 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); } 

将path置于上下文中,以便您尽可能地进行处理

稍微不同的CoreGraphics调用,我没有closurespath,以防你想添加

 CGContextFillPath(c); 

在你的视图中,在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); 

这将使您的视图的圆angular矩形。 您可以在随SDK提供的HeadsUpUI示例中find一个完整的示例。 HTH