如何在iphone上完成透明度的圆角矩形视图?

fra*_*yer 39 iphone cocoa-touch rounded-corners

许多应用程序在运行耗时的操作时会弹出带圆角的透明视图和activityIndi​​cator.

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

到目前为止,我已经设法通过在Interface Builder中设置alphaValue来获得具有相似透明度的基本视图,但它没有圆角,并且透明度似乎也适用于所有子视图(我不想要text和activityindicator透明,但即使我在IB中设置alphaValue似乎也被忽略了).

Mir*_*ich 78

从iPhone SDK 3.0开始,您只需使用图层的cornerRadius属性即可.例如:

view.layer.cornerRadius = 10.0;
Run Code Online (Sandbox Code Playgroud)

沿着相同的行,您可以更改视图的边框颜色和宽度:

view.layer.borderColor = [[UIColor grayColor] CGColor];
view.layer.borderWidth = 1;
Run Code Online (Sandbox Code Playgroud)

  • 如果在尝试访问`layer`属性时出错,则可能需要`#import <QuartzCore/QuartzCore.h>`.否则,这是手动绘制圆角的一个很好的选择,并且不必实现自定义`drawRect:`,它适用于简单的容器视图. (11认同)
  • 您可能还需要添加:view.layer.masksToBounds = YES; 如果您的图像超出了角半径. (4认同)

Kor*_*nel 47

view.layer.cornerRadius = radius;
Run Code Online (Sandbox Code Playgroud)

艰难的方式(以前在第一个iPhone SDK中需要)是UIView使用drawRect:方法创建自己的子类:

 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);
Run Code Online (Sandbox Code Playgroud)

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

  • 或者您使用UIBezierPath并保存写入所有代码:) (3认同)

bsh*_*ley 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);
}
Run Code Online (Sandbox Code Playgroud)

它会将路径放置在您可以使用的上下文中

稍微不同的CoreGraphics调用,我没有关闭路径,以防你想添加它

CGContextFillPath(c);
Run Code Online (Sandbox Code Playgroud)


los*_*sit 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);
Run Code Online (Sandbox Code Playgroud)

这将使您的圆角矩形为您的视图.您可以在随SDK提供的HeadsUpUI示例中找到完整的示例.HTH