尝试将UIView覆盖在UIImage上,并希望该UIView具有与UIImage相同的颜色。与此类似:
我正在TableView
中进行此操作。我发现了使用扩展和Pod的几种方法。我实现了所有这些功能,但是UIView
颜色似乎需要一段时间才能在单元格上呈现。不知道这是否与异步调用或我使用的方法有关。尝试实现类似功能时,有人看到过类似问题吗?
此外,我认为部分问题是我在哪里设置UIView.backgroundColor
。我在configureCell()
类的PostCell
函数中玩过它。
func configureCell(post: Post, img: UIImage? = nil) {
self.post = post
self.postDescription.text = post.wineName
DispatchQueue.main.async {
self.overImageView.backgroundColor = img?.averageColor
}
if img != nil {
self.postImage.image = img
} else {
let ref = Storage.storage().reference(forURL: post.imageUrl)
ref.getData(maxSize: 2 * 1024 * 1024, completion: { (data, error) in
if error != nil {
print("ERIC: Unable to download image from Firebase storage")
} else {
print("ERIC: Image downloaded from Firebase storage")
if let imgData = data {
if let img = UIImage(data: imgData) {
self.postImage.image = img
self.overImageView.backgroundColor = img.averageColor
FeedViewController.imageCache.setObject(img, forKey: post.imageUrl as NSString)
}
}
}
})
}
}
我应该在UIView
(上方)或PostCell
(下方)中实现FeedViewController
颜色吗?
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
//let cell = tableView.dequeueReusableCell(withIdentifier: "customMessageCell", for: indexPath) as! CustomMessageCell
print("POSTS: \(posts[indexPath.row])")
let post = posts[indexPath.row]
if let cell = tableView.dequeueReusableCell(withIdentifier: "PostCell", for: indexPath) as? PostCell{
if let img = FeedViewController.imageCache.object(forKey: post.imageUrl as NSString) {
cell.configureCell(post: post, img: img)
} else {
cell.configureCell(post: post)
}
return cell
} else {
return PostCell()
}
}
平均颜色代码:
extension UIImage {
var averageColor: UIColor? {
guard let inputImage = CIImage(image: self) else { return nil }
let extentVector = CIVector(x: inputImage.extent.origin.x, y: inputImage.extent.origin.y, z: inputImage.extent.size.width, w: inputImage.extent.size.height)
guard let filter = CIFilter(name: "CIAreaAverage", parameters: [kCIInputImageKey: inputImage, kCIInputExtentKey: extentVector]) else { return nil }
guard let outputImage = filter.outputImage else { return nil }
var bitmap = [UInt8](repeating: 0, count: 4)
let context = CIContext(options: [.workingColorSpace: kCFNull])
context.render(outputImage, toBitmap: &bitmap, rowBytes: 4, bounds: CGRect(x: 0, y: 0, width: 1, height: 1), format: .RGBA8, colorSpace: nil)
return UIColor(red: CGFloat(bitmap[0]) / 255, green: CGFloat(bitmap[1]) / 255, blue: CGFloat(bitmap[2]) / 255, alpha: CGFloat(bitmap[3]) / 255)
}
}
答案 0 :(得分:0)
我相信问题是您正在更改背景线程中的背景颜色。 UI更改(例如背景色)必须在主线程上进行更改。试试:
DispatchQueue.main.async {
self.overImageView.backgroundColor = img.averageColor
}