Ios 向圆形图像添加边框

Ios 向圆形图像添加边框,ios,swift,google-maps,uiimage,Ios,Swift,Google Maps,Uiimage,我一直在寻找许多堆栈溢出的帖子,但没有一篇能够给我提供我想要的解决方案。到目前为止,我已经能够得到一个图像,并转换成一个圆圈使用阿拉莫菲尔。然而,不幸的是,alamo fire没有提供向UIImage添加边框的选项。我想知道是否有人能解决我的问题。以下是我将图像做成圆形的代码: if let downloadedImage = UIImage(data: data!) { let markerImage = downloadedImage let markerImageSize =

我一直在寻找许多堆栈溢出的帖子,但没有一篇能够给我提供我想要的解决方案。到目前为止,我已经能够得到一个图像,并转换成一个圆圈使用阿拉莫菲尔。然而,不幸的是,alamo fire没有提供向UIImage添加边框的选项。我想知道是否有人能解决我的问题。以下是我将图像做成圆形的代码:

if let downloadedImage = UIImage(data: data!) {

   let markerImage = downloadedImage
   let markerImageSize = CGSize(width: 50, height: 50)
   let markerImageFilter = AspectScaledToFillSizeCircleFilter(size: markerImageSize)

   let finalMarkerImage = markerImageFilter.filter(markerImage)

   marker.icon = finalMarkerImage
}
正如你们所看到的,我可以得到一个圆,但不能得到一个有边界的圆。到目前为止,我已经尝试了许多堆栈溢出post解决方案,尝试使用我的AlamoFire解决方案。以下是一些帖子:

以下是我目前拥有的:

以下是我想要的:


任何帮助都将不胜感激。谢谢

我建议您对包含UIImage的UIImageView应用所需的外观,如下所示:

imageView.layer.cornerRadius = imageView.frame.size.width / 2
imageView.layer.masksToBounds = true
imageView.layer.borderWidth = 2
imageView.layer.borderColor = UIColor.brown.cgColor
marker.iconView = imageView
更新:

由于您使用的是Google Maps(
GMSMarker
),因此应该以编程方式创建UIImageView(将上面的代码片段应用于它),并将其添加到标记中,如下所示:

imageView.layer.cornerRadius = imageView.frame.size.width / 2
imageView.layer.masksToBounds = true
imageView.layer.borderWidth = 2
imageView.layer.borderColor = UIColor.brown.cgColor
marker.iconView = imageView
因此,它应该类似于:

// of course the values of the width/height (size) is up to you
let imageView = UIImageView(frame: CGRect(x: 0, y: 0, width: 100, height: 100))
imageView.layer.cornerRadius = imageView.frame.size.width / 2
imageView.layer.masksToBounds = true
imageView.layer.borderWidth = 2
imageView.layer.borderColor = UIColor.white.cgColor

// set your image
imageView.image = ...

marker.iconView = imageView

这将创建带有白色边框的圆形图像

func round(image: UIImage) -> UIImage {
    let imageWidth = image.size.width
    let imageHeight = image.size.height

    let diameter = min(imageWidth, imageHeight)
    let isLandscape = imageWidth > imageHeight

    let xOffset = isLandscape ? (imageWidth - diameter) / 2 : 0
    let yOffset = isLandscape ? 0 : (imageHeight - diameter) / 2

    let imageSize = CGSize(width: diameter, height: diameter)

    return UIGraphicsImageRenderer(size: imageSize).image { _ in

        let ovalPath = UIBezierPath(ovalIn: CGRect(origin: .zero, size: imageSize))
        ovalPath.addClip()
        image.draw(at: CGPoint(x: -xOffset, y: -yOffset))
        UIColor.white.setStroke()
        ovalPath.lineWidth = diameter / 50
        ovalPath.stroke()
    }
}
然后


适用于那些为@ashley answer的obj-c版本而苦苦挣扎的人们。同样的逻辑

+(UIImage*)将边框绘制到图像:(UIImage*)带有颜色的图像:(UIColor*)颜色和厚度:(CGFloat)厚度{
CGFloat直径=最小值(image.size.width,image.size.height);
BOOL isLandscape=image.size.width>image.size.height;
CGFloat xOffset=isLandscape?(image.size.width-diameter)/2:0;
CGFloat yOffset=isLandscape?0:(image.size.height-diameter)/2;
CGSize imageSize=CGSizeMake(直径,直径);
UIGraphicsBeginImageContext(image.size);
UIBezierPath*ovalPath=[UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0,imageSize.width,imageSize.height)];
[ovalPath addClip];
[图像绘制点:CGPointMake(-xOffset,-yOffset)];
CGContextRef context=UIGraphicsGetCurrentContext();
CGContextSetStrokeColorWithColor(上下文,color.CGColor);
ovalPath.lineWidth=厚度;
[卵形行程];
UIImage*BordereImage=UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsSendImageContext();
返回边界图像;
}

显示最终结果所需内容的图片。使尝试和帮助变得更容易?你想修改图像,还是只是在你的应用程序中渲染它?@DonMag我刚刚添加了一张我拥有的和我想要的图片。@Larme我只想将图像做成一个带边框的圆。只需设置你的
UIImageView
的角半径和
层。borderColor
是,我已经尝试过了,但问题是我无法将UIImageView添加到我的marker.icon值,因为该值必须是UIImage。是的,我使用的是谷歌地图,是的,我使用的是GMSMArkeView。我可以将
UIImageView
添加到标记中,检查更新:)我尝试过这样做,但我现在正在处理这个错误:初始化之前使用了常量imageView非常感谢!!!长期以来,我们一直在寻找这样的解决方案。再次感谢你!我知道我要问的可能是显而易见的,但你能解释一下我将如何使用我的变量downloadeImage在我的代码中实现你的解决方案吗?这是一个阳光明媚的好天气,所以我更新了我的答案,但实际上,你需要自己尝试解决一些问题。