#ios #swift #swiftui
#iOS #swift #swiftui
Вопрос:
(Xcode 12.0, SwiftUI) Этот код работал у меня почти 6 месяцев без каких-либо проблем, я только вчера получил эту ошибку без какого-либо редактирования. Я много пытался очистить код и сделать его короче, но у меня ничего не получалось.
GeometryReader { (geometry: GeometryProxy) in
ForEach(0..<5) { index in
Group {
Circle()
.foregroundColor(Color("GreyOne"))
.frame(width: geometry.size.width / 5, height: geometry.size.height / 5)
.scaleEffect(!self.isAnimating ? 1 - CGFloat(index) / 5 : 0.2 CGFloat(index) / 5)
.offset(y: geometry.size.width / 10 - geometry.size.height / 2)
}.frame(width: geometry.size.width, height: geometry.size.height)
.rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))
.animation(Animation
.timingCurve(0.5, 0.15 Double(index) / 5, 0.25, 1, duration: 1.5)
.repeatForever(autoreverses: false))
}
}.aspectRatio(1, contentMode: .fit)
.onAppear {
self.isAnimating = true
}
Ответ №1:
Вы можете переместить части вашего View
в отдельные частные функции и просто вызвать их из body
. В вашем коде было несколько ошибок компилятора, например, не переход x
к offset
функции или не преобразование всех Int
s в CGFloat
. Как только вы разобьете body
свой View
, появятся реальные ошибки.
Вот скомпилированная версия вашего кода, использующая 2 частные функции для сборки частей body
вашего View
.
struct YourView: View {
@State private var isAnimating = false
var body: some View {
GeometryReader { geometry in
ForEach(0..<5) { index in
Group {
circle(geometry: geometry, index: index)
}
.frame(width: geometry.size.width, height: geometry.size.height)
.rotationEffect(!self.isAnimating ? .degrees(0) : .degrees(360))
.animation(animation(index: index))
}
}
.aspectRatio(1, contentMode: .fit)
.onAppear {
self.isAnimating = true
}
}
private func animation(index: Int) -> Animation {
Animation
.timingCurve(0.5, 0.15 Double(index) / 5, 0.25, 1, duration: 1.5)
.repeatForever(autoreverses: false)
}
private func circle(geometry: GeometryProxy, index: Int) -> some View {
let width = geometry.size.width
let height = geometry.size.height
let yOffset = width / 10 - height / 2
let nonAnimatingScale = 1 - CGFloat(index) / CGFloat(5)
let animatingScale = 0.2 CGFloat(index) / CGFloat(5)
return Circle()
.foregroundColor(Color("GreyOne"))
.frame(width: width / 5, height: height / 5)
.scaleEffect(self.isAnimating ? animatingScale : nonAnimatingScale)
.offset(x: 0, y: yOffset)
}
}