ios - 如何在 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
后来我尝试了另一种解决方案,即
let button = UIButton()
button.frame = CGRect(x: 0, y: 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]
在第二个解决方案中,它可以工作,但图像正在重绘,就像镜像向下一样。请帮助我如何在 UIBarButtonItems 中放置圆形头像。
解决方案
我使用了以下方法,
let button = UIButton(type: .system)
button.frame = CGRect(x: 0, y: 0, width: 30, 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))
}
}}
在上面的示例中,我曾经Data(contentsOf: URL)
从互联网加载图像,但最好异步获取图像。检查此以获取更多详细信息。
推荐阅读
- c# - 如何禁用 ListBox 中的按键导航但继续检测按键事件?
- tableau-api - Tableau elseif 语句
- powerbi - Power BI / Power Query [M 代码] - 添加基于源的自定义列
- docker - Dockerfile - 如何定义主机文件系统到容器的挂载
- jquery - 如果单击一次,如何获得返回 false 的链接,如果再次单击则返回 true?
- rest - 制作 Postman 测试 - Grails
- sonarqube - 如何将带有级联测试套件的 PHPUnit 报告导入 Sonarqube?
- javascript - 为什么反应不渲染元素?
- jsf - 关于值更改的 JSF 打开对话框
- android - 添加 github 库作为依赖项不起作用