SwiftUI: Как работать с фреймворками, не поддерживающими симулятор, и PreviewProvider?
Я работаю над приложением RealityKit и использую SwiftUI.
Конечно, представление RealityKit не работает в SwiftUI PreviewProvider
Предварительный просмотр. Но моя проблема в том, что даже простые и полностью изолированные представления SwiftUI не будут просматриваться, так как PreviewProvider
Необходимо скомпилировать весь проект.
Мои классы SwiftUI View никак не связаны с кодом ARView. Достаточно просто выбрать "Файл" -> "Создать" и выбрать файл SwiftUI, а затем попытаться просмотреть его на холсте (⌥ + ⌘ + ↵) без каких-либо изменений. Тогда это даст мне эту ошибку. Просто тот факт, что в моем коде есть .xcodeproj
это не поддерживает предварительный просмотр холста, выдает ошибку.
Я получаю такие ошибки:
Value of type 'ARView' has no member 'installGestures'
Пока у меня есть только два решения: 1) скопировать файл на игровую площадку и поэкспериментировать с ним, а затем скопировать обратно, когда закончите. 2) закомментируйте весь неподдерживаемый код, связанный с RealityKit, перед началом работы с представлением.
Q: Конечно, ни одно из этих решений не является оптимальным. Есть ли лучшие решения там?
1 ответ
Я столкнулся с той же проблемой. Мое решение заключалось в использовании директивы компилятора targetEnvironment(simulator) следующим образом:
struct ContentView : View {
var body: some View {
#if !targetEnvironment(simulator)
ARViewContainer()
.edgesIgnoringSafeArea(.all)
.statusBar(hidden: true)
#endif
}
}
}
#if !targetEnvironment(simulator)
struct ARViewContainer: UIViewRepresentable {
func makeUIView(context: Context) -> ARView {
let arView = ARView(frame: .zero)
// ARKit / RealityKit specific code
...
return arView
}
func updateUIView(_ arView: ARView, context: Context) {}
}
#endif
Дополнительное чтение: https://www.hackingwithswift.com/example-code/language/how-to-use-compiler-directives-to-detect-the-ios-simulator
В то время как новый симулятор в iOS 13 поддерживает Metal, ARView требует фактического устройства для захвата кадров камеры и генерации данных слияния датчиков. И у него есть масса свойств и методов, которые вам нужно будет смоделировать, чтобы разрешить взаимодействие с другим кодом.
Можете ли вы абстрагировать взаимодействие ARView между SwiftUI через протокол, реализованный другим классом, таким как подкласс UIView или UIViewController? Если протокол достаточно прост, вы можете создать класс, который будет имитировать взаимодействие, отвечая на ваши представления SwiftUI, как если бы он действительно взаимодействовал с ARView, без реализации всего API-интерфейса ARView.
Ваши представления SwiftUI, вероятно, не должны иметь дело с настройкой и произвольным доступом к свойствам и методам ARView напрямую. Вы можете создать оболочку вокруг ARView и представить логику и действия на уровне приложения, хотя объединяйте издателей и подписчиков. Макетная версия, которая оборачивает UIView и имеет одинаковые pub/subs, может представлять простые визуальные подсказки, такие как изменение цвета, для представления различных состояний ARView и т. Д.