Swift开发iOS时UIImageView设置圆形背景不显示怎么办
问题

为UIImageView添加圆形背景时,实际运行效果仅能显示内部图片,设置的背景、圆角样式均无法正常展示,复现代码如下:
lazy var circle: UIImageView = { let view = UIImageView() view.contentMode = .scaleAspectFit view.image = UIImage(named: "iconsCancelThin") view.frame = CGRect(x: 0, y: 0, width: 32, height: 32) view.tintColor = KSColor.neutral700.getColor() view.backgroundColor = KSColor.neutral700.getColor() view.clipsToBounds = true view.layer.cornerRadius = 16 return view }() guard let image = circle.image else { return } self.cancelButton.setBackgroundImage(image, for: .normal, barMetrics: .default)
原因
代码最后仅提取了circle实例的image属性赋值给按钮,这个属性只存储了iconsCancelThin对应的原始图标资源。之前给UIImageView设置的背景色、圆角、裁剪属性都属于UIView的图层样式,不会被包含在原始图片对象里,这些配置完全没有被应用到按钮上,自然看不到圆形背景效果。
解决方案
可根据实际需求二选一:
- 直接配置按钮本身的样式,不需要额外创建UIImageView包装图标
// 直接给cancelButton设置属性,无需单独创建circle实例 cancelButton.frame = CGRect(x: 0, y: 0, width: 32, height: 32) cancelButton.tintColor = KSColor.neutral700.getColor() cancelButton.backgroundColor = KSColor.neutral700.getColor() cancelButton.clipsToBounds = true cancelButton.layer.cornerRadius = 16 cancelButton.setImage(UIImage(named: "iconsCancelThin"), for: .normal) - 如果必须拿到带圆形背景的图片再赋值给按钮,需要把配置好的UIImageView整体渲染成新的图片对象,不要直接取原始image属性
// 将配置完样式的circle渲染为带背景的新图片 UIGraphicsBeginImageContextWithOptions(circle.bounds.size, false, UIScreen.main.scale) guard let context = UIGraphicsGetCurrentContext() else { return } circle.layer.render(in: context) let roundedBgImage = UIGraphicsGetImageFromCurrentImageContext() UIGraphicsEndImageContext() // 将渲染完成的图片设为按钮背景 self.cancelButton.setBackgroundImage(roundedBgImage, for: .normal, barMetrics: .default)
内容的提问来源于stack exchange,提问作者Mert Köksal
相关产品推荐
相关产品推荐

