import SwiftUI
struct ContentView: View {
private let letters: [String] = ["A", "B", "C"]
private let numbers: [Int] = [
4, 5, 21, // A, B, C
23, 27, 36, // A, B, C
37, 52, 59 // A, B, C
]
@State private var randomNumber: Int = 0
@State private var rotation: CGFloat = 0.0
@State private var started: Bool = false
var body: some View {
VStack {
ZStack {
ZStack {
Circle()
.foregroundColor(.blue)
ForEach(letters.indices) { i in
Text(letters[i])
.foregroundColor(.white)
.offset(x: 0, y: -110)
.rotationEffect(.degrees(Double(i * (360 / letters.count))))
}
}
.frame(width: 250, height: 250, alignment: .center)
.rotationEffect(.degrees(rotation))
VStack {
Text("Rotation: \(rotation, specifier: "%.2f")")
Text("Number: \(randomNumber)")
Text("Closest: \(closest(to: randomNumber))")
}
}
Spacer()
.frame(height: 50)
Button(started ? "Stop" : "Start", action: started ? stop : start)
.buttonStyle(.borderedProminent)
.tint(started ? .red : .blue)
}
}
private func start() {
started = true
loop()
}
private func stop() {
started = false
}
private func loop() {
if !started { return }
randomNumber = .random(in: numbers.min()!...numbers.max()!)
withAnimation {
rotation = CGFloat(0)
}
DispatchQueue.main.asyncAfter(deadline: .now() 1, execute: loop)
}
private func closest(to x: Int) -> Int {
return numbers.enumerated().min(by: { abs($0.1 - x) < abs($1.1 - x)})!.element
}
}
您好,我想根據 randomNumber 值旋轉 zstack 以匹配陣列中的字母編號,例如如果 randomNumber = 30 最接近的數字 = 27 在圓圈中標記為 B 我想旋轉 zstack 以便字母 B 指向北方但是有點偏移,因為數字是 30 而不是 27
上面的代碼是計算發生在 withAnimation 括號內的回圈函式中的示例
謝謝
uj5u.com熱心網友回復:
這是您的回圈的建議,因此旋轉會選擇陣列中最接近的數字:
randomNumber = .random(in: numbers.min()!...numbers.max()!)
let differences = numbers.compactMap { abs($0 - randomNumber) }.sorted { $0 < $1 }
let closest = randomNumber - (differences.first ?? 0)
withAnimation {
if numbers.contains(closest) {
rotation = closest
} else {
rotation = randomNumber (differences.first ?? 0)
}
}
請記住使用正確的型別(Int、CGFloat…)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/431356.html
