如何在iOS Swift中将舍入的个人资料图片图像从URL字符串设置为UIBarButton项目

问题描述

您好,我正在研究一个iOS Swift项目,在该项目中,我想在导航栏中向用户显示四舍五入的个人资料图片。我尝试了许多示例代码,但没有绘制圆角曲线。请帮助我。

我已经尝试过这些代码

var image = UIImage()
if let userImage = UserProfile.image {
   let imageUrl = self.dmcCommon.convertStringToImageURL(url: userImage)
   let data = (try? Data(contentsOf: imageUrl as URL))!
   image = UIImage(data: data)!
} else {
   image = UIImage(named: "Me")!
}

let v = UIImageView(frame: CGRect(x: 0,y: 0,width: 40,height: 40))
v.image = image
v.layer.masksToBounds = true
v.layer.cornerRadius = 20

let rightBtn = UIBarButtonItem(customView: v)
self.navigationItem.rightBarButtonItem = rightBtn

结果是这样的,

enter image description here

这里的图像没有变圆,也没有像我给的那样全宽。

后来我尝试了另一种解决方案,

let button = UIButton()
button.frame = CGRect(x: 0,width: 30,height: 30)
var image = UIImage()
if let userImage = UserProfile.image {
   let imageUrl = self.dmcCommon.convertStringToImageURL(url: userImage)
   let data = (try? Data(contentsOf: imageUrl as URL))!
   image = UIImage(data: data)!
} else {
   image = UIImage(named: "Me")!
}
UIGraphicsBeginImageContextWithOptions(button.frame.size,false,image.scale)
let rect  = CGRect(x:0,y:0,width:button.frame.size.width,height:button.frame.size.height)
UIBezierPath(roundedRect: rect,cornerRadius: rect.width/2).addClip()
image.draw(in: rect)
let newImage = UIGraphicsGetimageFromCurrentimageContext()!
UIGraphicsEndImageContext()

button.addTarget(self,action:#selector(self.navToMe),for: UIControl.Event.touchUpInside)
let color = UIColor(patternImage: newImage)
button.backgroundColor = color
button.layer.cornerRadius = 0.5 * button.bounds.size.width
let barButton = UIBarButtonItem()
barButton.customView = button
self.navigationItem.rightBarButtonItems = [notificationButton,barButton]

结果是,

enter image description here

在第二种解决方案中,它可以工作,但是图像正在重绘,就像镜像到向下一样。请帮助我如何在UIBarButtonItems中放置圆形的头像。

解决方法

尝试一下

    let frame = CGRect(x: 0,y: 0,width: 30,height: 30)
    let customView = UIView(frame: frame)
    let imageView = UIImageView(image: UIImage(named: "turtle"))
    imageView.frame = frame
    imageView.layer.cornerRadius = imageView.frame.height * 0.5
    imageView.layer.masksToBounds = true
    customView.addSubview(imageView)
    navigationItem.rightBarButtonItems = [
        UIBarButtonItem(systemItem: .action),UIBarButtonItem(customView: customView)
    ]

enter image description here

使用UIImage(data :)构造函数代替UIImage(name:)

,

我使用了以下方法,

let button = UIButton(type: .system)
button.frame = CGRect(x: 0,height: 30)
button.layer.cornerRadius = 15
button.clipsToBounds = true
button.imageView?.contentMode = .scaleAspectFit

let imageData = try? Data(contentsOf: URL(string : "https://www.w3schools.com/howto/img_avatar.png")!)

if let imageData = imageData,let image =  UIImage(data: imageData)?.resizeImage(to: button.frame.size) {
    button.setBackgroundImage(image,for: .normal)
}
navigationItem.rightBarButtonItem = UIBarButtonItem(customView: button)

调整图像大小

extension UIImage {
    func resizeImage(to size: CGSize) -> UIImage {
       return UIGraphicsImageRenderer(size: size).image { _ in
           draw(in: CGRect(origin: .zero,size: size))
    }
}}

reviver

在上面的示例中,我使用Data(contentsOf: URL)从Internet加载图像,但是最好异步获取图像。检查enter image description here了解更多详细信息。

,

您不需要自定义按钮或图像视图。并且不要使用圆角倒圆。只需将目标图像绘制成所需大小并裁剪成一个圆形,然后将其用作条形按钮项的image即可。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...