以与背景中的主UIImage颜色相同的颜色覆盖UIView

时间:2020-01-08 01:45:25

标签: ios swift

尝试将UIView覆盖在UIImage上,并希望该UIView具有与UIImage相同的颜色。与此类似:

enter image description here

我正在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)
    }
}

1 个答案:

答案 0 :(得分:0)

我相信问题是您正在更改背景线程中的背景颜色。 UI更改(例如背景色)必须在主线程上进行更改。试试:

DispatchQueue.main.async {
       self.overImageView.backgroundColor = img.averageColor 
}
相关问题