ios - 在背景中使用与主要 UIImage 颜色相同的颜色覆盖 UIView

标签 ios swift

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

enter image description here

我在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/

相关文章:

ios - 更改嵌入导航 Controller 的宽度/高度 UINavigationBar?

ios - 如何向 loadRequest 添加闭包?

ios - 使用分段控件在 ios 中的 View 之间切换 View

针对游戏外观和感觉应用程序的 iPhone/iPad 架构建议

iphone - 从自定义表格 View 单元格类加载时如何调整单元格的高度?

ios - 访问未定义的 stage_in Metal 着色器参数

ios - 我可以通过电子邮件将 UIDocuments 作为附件发送吗?

ios - 如何使用调度组在类初始化时异步等待 Firebase 回调?

swift - 如何更改标签中某些单词的颜色 - Swift 3

swift - (Swift)(Firebase) 通过 Facebook 登录获取 EXC_BAD_INSTRUCTION