Захват текста с изображения — SwiftUI

#ios #swift #swiftui

Вопрос:

Новая функция iOS 15 «Захват текста с изображения» появляется только после второго нажатия. Таким образом, Команда Apple предоставила

 let textFromCamera  = UIAction.captureTextFromCamera(responder: self.notes, identifier: nil)
 

Когда я попытался использовать то же самое с SwiftUI, объект responser должен подтвердить UIResponder/UIKeyInpunt.

Как использовать то же самое с SwiftUI или есть ли какой-либо альтернативный вариант в SwiftUI ?

Ответ №1:

У меня нет iPhone с iOS 15/нейронным движком, чтобы протестировать его прямо сейчас, но это должно сработать. Я могу заставить его работать до щелчка по меню.

В видео WWDC говорится, что оно доступно в iPhone с нейронным двигателем, который, по-моему, является iPhone X и выше. На данный момент об этом мало документации

 import SwiftUI

@available(iOS 15.0, *)
struct ActionMenuView: View {
    @State var text: String = ""
    var body: some View {
        HStack{
            Text(text)
            ActionMenuView_UI(text: $text)
        }
    }
}
@available(iOS 15.0, *)
struct ActionMenuView_UI: UIViewRepresentable {
    @Binding var text: String
    
    func makeCoordinator() -> Coordinator {
        Coordinator(self)
    }
    func makeUIView(context: Context) -> some UIView {

        //let choosePhotoOrVideo = UIAction(…)
        //let takePhotoOrVideo = UIAction(…)
        //let scanDocuments = UIAction(…)

        // A UIButton can hold the menu, it is a long press to get it to come up
        let button = UIButton()
        let textFromCamera = UIAction.captureTextFromCamera(responder: context.coordinator, identifier: nil)
        let cameraMenu = UIMenu(children: [
            //choosePhotoOrVideo, takePhotoOrVideo, scanDocuments,
            textFromCamera])
        button.setImage(UIImage(systemName: "camera.badge.ellipsis"), for: .normal)
        button.menu = cameraMenu
        return button
    }
    func updateUIView(_ uiView: UIViewType, context: Context) {
        
    }
    //Making the Coordinator a UIResponder as! UIKeyInput gives access to the text
    class Coordinator: UIResponder, UIKeyInput{
        var hasText: Bool{
            !parent.text.isEmpty
        }
        
        let parent: ActionMenuView_UI
        
        init(_ parent: ActionMenuView_UI){
            self.parent = parent
        }
        func insertText(_ text: String) {
            //Update the @Binding
            parent.text = text
        }

        func deleteBackward() { }
    }
}
@available(iOS 15.0, *)
struct ActionMenuView_Previews: PreviewProvider {
    static var previews: some View {
        ActionMenuView()
    }
}