避免 UIImage 填充颜色渗入 UIImageView
Avoid UIImage fill color from bleeding into UIImageView
我想将包含透明部分的 UIImage 填充到 UIImageView 中(即填充到 UIImageView space 中,因为图像具有“Scale Aspect Fit”设置)
如何做到?
我尝试绘制 masks/contexts,将 masksToBounds/clipsToBounds/isOpaque 设置为 true/false,但它会流血(或者整个东西变成一个纯色框)。
我想要的(注意内部是白色的,但图像周围是透明的,因此是主要颜色。此屏幕截图来自 iOS 15 设置应用程序):
我目前拥有的(图像填充颜色在图像外渗出。这是我的应用程序):
Notes:
- I am using SF Symbols for the images
- The images have a transparent section inside, which is what I want to fill with a color other than the main background color of the UIImageView (while I want the UIImageView background to be transparent)
使用顺丰符号:
checkmark.square.fill
divide.square.fill"
arrow.up.and.down.square.fill
questionmark.square.fill
arrow.right.square.fill
arrow.left.square.fill
SF 符号将内部的透明封闭形状识别为可以填充颜色的单独形状。
正在寻找的是填充复选标记形状的渲染模式(例如)。 SF符号默认使用单色渲染模式,您可以使用调色板渲染或多色渲染(SF符号2.0部分支持,3.0完全支持)
4 rendering modes 分别为单色、分层、调色板和多色。
警告:一些 SF 符号受版权保护,不能使用,Apple 也警告不要让 SF 符号看起来像系统图标。
您可以使用 SF symbols 应用程序查看版权、渲染模式和颜色符号,您可以从这里下载 https://developer.apple.com/sf-symbols/
编辑:
对于您的具体情况,并且因为您要使用的所有符号都有一个圆角矩形,您可以在 UIImage 后面添加一个白色圆角矩形图像(比原始符号略小)。
我最后做的是为每个图标添加一个容器视图,将图标放在容器中,给容器一个cornerRadius,从图标到容器的约束,从背景颜色到图标,以及白色背景颜色到容器。这是一些信息:
// MARK: Properties
let myDataSource = [Const.Title.check,
Const.Title.factorize,
Const.Title.list,
Const.Title.random,
Const.Title.next,
Const.Title.previous]
let myImageSource = ["checkmark",
"divide",
"arrow.up.and.down",
"wand.and.stars",
"arrow.right",
"arrow.left"]
let tintColorsArray: [UIColor] = [
.systemGreen,
.systemBlue,
.systemPurple,
.systemOrange,
.systemTeal,
.systemTeal
]
// MARK: Table
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: menuCell) as! MainMenuTableViewCell
cell.myLabel.text = myDataSource[(indexPath as NSIndexPath).row]
let aConfig = UIImage.SymbolConfiguration(weight: .bold)
let aImage = UIImage(systemName: myImageSource[(indexPath as NSIndexPath).row], withConfiguration: aConfig)
cell.newImageView.image = aImage
cell.newImageView.tintColor = .white
cell.imageViewContainer.backgroundColor = tintColorsArray[(indexPath as NSIndexPath).row]
cell.imageViewContainer.layer.cornerRadius = 6
cell.accessoryType = .disclosureIndicator
return cell
}
我想将包含透明部分的 UIImage 填充到 UIImageView 中(即填充到 UIImageView space 中,因为图像具有“Scale Aspect Fit”设置)
如何做到?
我尝试绘制 masks/contexts,将 masksToBounds/clipsToBounds/isOpaque 设置为 true/false,但它会流血(或者整个东西变成一个纯色框)。
我想要的(注意内部是白色的,但图像周围是透明的,因此是主要颜色。此屏幕截图来自 iOS 15 设置应用程序):
我目前拥有的(图像填充颜色在图像外渗出。这是我的应用程序):
Notes:
- I am using SF Symbols for the images
- The images have a transparent section inside, which is what I want to fill with a color other than the main background color of the UIImageView (while I want the UIImageView background to be transparent)
使用顺丰符号:
checkmark.square.fill
divide.square.fill"
arrow.up.and.down.square.fill
questionmark.square.fill
arrow.right.square.fill
arrow.left.square.fill
SF 符号将内部的透明封闭形状识别为可以填充颜色的单独形状。
正在寻找的是填充复选标记形状的渲染模式(例如)。 SF符号默认使用单色渲染模式,您可以使用调色板渲染或多色渲染(SF符号2.0部分支持,3.0完全支持)
4 rendering modes 分别为单色、分层、调色板和多色。
警告:一些 SF 符号受版权保护,不能使用,Apple 也警告不要让 SF 符号看起来像系统图标。
您可以使用 SF symbols 应用程序查看版权、渲染模式和颜色符号,您可以从这里下载 https://developer.apple.com/sf-symbols/
编辑:
对于您的具体情况,并且因为您要使用的所有符号都有一个圆角矩形,您可以在 UIImage 后面添加一个白色圆角矩形图像(比原始符号略小)。
我最后做的是为每个图标添加一个容器视图,将图标放在容器中,给容器一个cornerRadius,从图标到容器的约束,从背景颜色到图标,以及白色背景颜色到容器。这是一些信息:
// MARK: Properties
let myDataSource = [Const.Title.check,
Const.Title.factorize,
Const.Title.list,
Const.Title.random,
Const.Title.next,
Const.Title.previous]
let myImageSource = ["checkmark",
"divide",
"arrow.up.and.down",
"wand.and.stars",
"arrow.right",
"arrow.left"]
let tintColorsArray: [UIColor] = [
.systemGreen,
.systemBlue,
.systemPurple,
.systemOrange,
.systemTeal,
.systemTeal
]
// MARK: Table
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: menuCell) as! MainMenuTableViewCell
cell.myLabel.text = myDataSource[(indexPath as NSIndexPath).row]
let aConfig = UIImage.SymbolConfiguration(weight: .bold)
let aImage = UIImage(systemName: myImageSource[(indexPath as NSIndexPath).row], withConfiguration: aConfig)
cell.newImageView.image = aImage
cell.newImageView.tintColor = .white
cell.imageViewContainer.backgroundColor = tintColorsArray[(indexPath as NSIndexPath).row]
cell.imageViewContainer.layer.cornerRadius = 6
cell.accessoryType = .disclosureIndicator
return cell
}