Я пытаюсь интегрировать представление SwiftUI, которое анимирует изменения в переменной @State (первоначально прогресс был @ Состояние частного прогресса: CGFloat = 0,5 в представлении SwiftUI), в существующее приложение UIKit. Я прочитал много результатов поиска по интеграции SwiftUI в UIKit (@State, @Binding, @Environment, et c.), Но не могу понять это.
Я создаю очень простой пример того, что я пытаюсь сделать, поскольку, как я полагаю, когда я увижу этот ответ, я могу применить его к своему существующему приложению.
Раскадровка - это просто просмотр контроллера с UISlider. Приведенный ниже код отображает представление SwiftUI, но я хочу, чтобы оно обновлялось при перемещении UISlider.
import SwiftUI
class ViewController: UIViewController {
var progress: CGFloat = 0.5
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let frame = CGRect(x: 20, y: 200, width: 400, height: 400)
let childView = UIHostingController(rootView: Animate_Trim(progress: progress))
addChild(childView)
childView.view.frame = frame
view.addSubview(childView.view)
childView.didMove(toParent: self)
}
@IBAction func sliderAction(_ sender: UISlider) {
progress = CGFloat(sender.value)
print("Progress: \(progress)")
}
}
struct Animate_Trim: View {
var progress: CGFloat
var body: some View {
VStack(spacing: 20) {
Circle()
.trim(from: 0, to: progress) // Animate trim
.stroke(Color.blue,
style: StrokeStyle(lineWidth: 40,
lineCap: CGLineCap.round))
.frame(height: 300)
.rotationEffect(.degrees(-90)) // Start from top
.padding(40)
.animation(.default)
Spacer()
}.font(.title)
}
}```