首页 文章

如何在iPhone上使用SOFT EDGE绘制圆角矩形?

提问于
浏览
1

我需要在图像上叠加一些文字 . 因为图像有很多细节,所以我需要做一些事情来使文本更清晰 .

我想做的是在文本下面画一个半透明的白色圆角矩形和一个SOFT EDGE .

我试过画一个带有白色阴影的白色圆角矩形,但这并没有给我带来我想要的效果 . 它会在圆角矩形和阴影之间产生硬边 . 我希望它是一个平稳的过渡 .

有任何想法吗?

2 回答

  • -1

    我做了类似于 CGGradient 的事情,这很痛苦,最后的结果看起来并不那么好 . 一种更简单的方法是使用 - (UIImage *)stretchableImageWithLeftCapWidth:(NSInteger)leftCapWidth topCapHeight:(NSInteger)topCapHeight 使用部分透明的PNG创建边缘

    透明图形是昂贵的,所以如果你有很多标签,这可能会过度降低性能,但如果你只有少数(并且他们不移动或需要大量重绘)你会没事的 .

  • 1

    您需要子类化 UIView 并修改 drawRect: 方法以允许半径 . 对于具有固定半径10.0px的 drawRect: 的代码示例,请尝试以下操作:

    - (void)drawRect:(CGRect)rect {
    
        float radius = 10.0f;
    
        CGContextRef context = UIGraphicsGetCurrentContext();
        CGContextSetRGBFillColor(context, 255,255,255,0.25);
    
        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 / 4, M_PI / 2, 1);
        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);
    }
    

    因此,最好的方法是添加

    @property CGFloat radius;
    

    到你的头文件,并覆盖默认构造函数来读取:

    -(id) initWithFrame:(CGRect)aRect radius:(CGFloat)rad color:(UIColor *)bgColor opacity:(CGFloat)opacity {
        if (self = [super initWithFrame:aRect]) {
            [self setOpacity:opacity];
            [self setBackgroundColor:bgColor];
            [self setRadius:rad];
        }
    }
    

    并调整我的上述方法,为所有 radius 调用包含 self.radius ,删除顶部的 float 声明 .

相关问题