尝试将 UIView 覆盖在 UIImage 上,并希望 UIView 与 UIImage 具有相同的颜色。与此类似:
我在TableView
中执行此操作。我找到了几种使用扩展和 Pod 来实现此目的的方法。我实现了其中的每一个,但似乎 UIView
颜色需要一段时间才能在单元格上渲染。不确定这是否与异步调用或我使用的方法有关。有人在尝试实现类似功能时遇到过类似问题吗?
此外,我认为部分问题在于我设置 UIView.backgroundColor
的位置。我在 PostCell
类的 configureCell()
函数中使用了它。
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)
}
}
}
})
}
}
我应该在 PostCell
(上图)还是 FeedViewController
(下图)中实现 UIView
颜色?
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)
}
}
最佳答案
我认为问题是您正在更改背景线程中的背景颜色。 UI 更改(例如背景颜色)必须在主线程上更改。尝试:
DispatchQueue.main.async {
self.overImageView.backgroundColor = img.averageColor
}
关于ios - 在背景中使用与主要 UIImage 颜色相同的颜色覆盖 UIView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59638375/