#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()
}
}