我最近回来测试一个视图控制器,该控制器以前工作并获取本地保存的视频文件,从该文件创建缩略图,并使用testButton.backgroundColor = UIColor(patternImage: image!)
where将缩略图显示为 UIButton 的背景颜色image = generateThumbnail()
。现在,由于某种原因,当我尝试将图像转换为背景颜色的图案时,背景颜色变为黑色,没有图像。
如果我使用诸如UIColor(patternImage: (UIImage(named: "Picture"))
(而不是从中生成的 UIImage generateThumbnail()
)之类的资产,则按预期将背景颜色设置为图像。
下面是我的 generateThumbnail()
private func generateThumbnail(url: URL) -> UIImage? {
let videoAsset : AVAsset = AVAsset(url: url)
let assetImageGenerator : AVAssetImageGenerator = AVAssetImageGenerator(asset: videoAsset)
assetImageGenerator.appliesPreferredTrackTransform = true
var time = videoAsset.duration
time.value = min(time.value, 2)
do{
let thumbnail = try assetImageGenerator.copyCGImage(at: time, actualTime: nil)
let framedThumbnail : UIImage = UIImage(cgImage: thumbnail)
return framedThumbnail
} catch {
print("Error saving thumbnail \(error.localizedDescription)")
return nil
}
}
这是将 UIImage 传递给 backgroundColor 的示例 - 这会产生黑色背景
let urlTest = Bundle.main.url(forResource: "SampleVideo", withExtension: "mp4")!
let image = generateThumbnail(url: urlTest)
let testButton = UIButton()
testButton.frame = CGRect(x: 0, y: 0, width: 400, height: 300)
testButton.backgroundColor = UIColor(patternImage: image!)
从资产文件加载本地图像的示例 - 正确生成,图像设置为按钮的背景:
let image = UIImage(named: "Sample")
let testButton = UIButton()
testButton.frame = CGRect(x: 0, y: 0, width: 400, height: 300)
testButton.backgroundColor = UIColor(patternImage: image!)
是的,urlTest
运行时确实会生成图像generateThumbnail
。我可以让它UIImageView()
按预期在测试中显示,不知道为什么设置为背景颜色时它会变黑
tl;dr 为什么我创建的缩略图图像不会显示为按钮的背景,而资产图像会显示?
编辑:解决了问题
使用.setBackgroundImage
UIButton 上的方法。解决的例子:
let urlTest = Bundle.main.url(forResource: "SampleVideo", withExtension: "mp4")!
let image = generateThumbnail(url: urlTest)
let testButton = UIButton()
thumbButton.setBackgroundImage(image, for: .normal)
我不记得以前在 UIButton 上看到过该方法作为选项,可能是 Swift 5 中的新方法¯\_(ツ)_/¯