0

I have a simple UIViewRepresentable wrapper for the live text feature (ImageAnalysisInteraction). It was working without issues until I started updating the UIImage inside the updateUIView(...) function.

I have always been seeing this error in the console which originates from this view: [api] -[CIImage initWithCVPixelBuffer:options:] failed because the buffer is nil.

When I change the image, it's updating correctly, but the selectableItemsHighlighted overlay stays the same and I can still select the text of the old image (even though it's no longer visible).

import UIKit
import SwiftUI
import VisionKit


@MainActor
struct LiveTextInteraction: UIViewRepresentable {
    @Binding var image: UIImage
    let interaction = ImageAnalysisInteraction()
    let imageView = LiveTextImageView()
    let analyzer = ImageAnalyzer()
    let configuration = ImageAnalyzer.Configuration([.text])
    
    
    func makeUIView(context: Context) -> UIImageView {
        interaction.setSupplementaryInterfaceHidden(true, animated: true)
        imageView.image = image
        imageView.addInteraction(interaction)
        imageView.contentMode = .scaleAspectFit
        return imageView
    }
    
    
    func updateUIView(_ uiView: UIImageView, context: Context) {
        Task {
            uiView.image = image
            do {
                if let image = uiView.image {
                    let analysis = try await analyzer.analyze(image, configuration: configuration)
                    interaction.analysis = analysis;
                    interaction.preferredInteractionTypes = .textSelection
                    interaction.selectableItemsHighlighted = true
                    interaction.setContentsRectNeedsUpdate()
                }
            } catch {
                // catch
            }
        }
        
    }
}


class LiveTextImageView: UIImageView {
    // Use intrinsicContentSize to change the default image size
    // so that we can change the size in our SwiftUI View
    override var intrinsicContentSize: CGSize {
        .zero
    }
}

What am I doing wrong here?

fer0n
  • 295
  • 1
  • 5
  • 14

1 Answers1

0

It looks like a bug. Try use dispatch

let highlighted = interaction.selectableItemsHighlighted
interaction.analysis = analysis // highlighted == false
if highlighted
{
    DispatchQueue.main.async
    {
        interaction.selectableItemsHighlighted = highlighted
    }
}

You don't need interaction.setContentsRectNeedsUpdate() if the interaction is added to a UIImageView