У меня есть следующий код:
Rectangle()
.fill(Color.red)
.frame(width: 60, height: 60, alignment: .center)
.cornerRadius(recording ? 5 : 30)
Поэтому мне было интересно, может ли .frame быть условным, как и .cornerRadius. Я делаю это, чтобы трансформировать форму, но мне также нужно сделать ее меньше, когда она трансформируется. Примером может служить кнопка записи приложения Voice Memos.





Да, вы также можете использовать тернарный условный оператор с .frame.
Пример:
.frame(width: recording ? 40 : 60, height: recording ? 40 : 60, alignment: .center)
Если вы говорите об отсутствии модификатора кадра вообще (или о предоставлении чистого способа создания разных кадров), ViewModifier может быть хорошим вариантом:
struct ContentView: View {
@State private var recording = false
var body: some View {
Rectangle()
.fill(Color.red)
.modifier(CustomFrameModifier(active: recording))
.cornerRadius(recording ? 5 : 30)
}
}
struct CustomFrameModifier : ViewModifier {
var active : Bool
@ViewBuilder func body(content: Content) -> some View {
if active {
content.frame(width: 60, height: 60, alignment: .center)
} else {
content
}
}
}
Ну что ж. Это на самом деле намного чище. Большое спасибо!
Можно сделать с ?

import SwiftUI
struct ContentView: View {
@State private var recording: Bool = Bool()
@State private var color: Color = Color.blue
var body: some View {
ZStack {
Circle()
.fill(Color.white)
.frame(width: 60.0, height: 60.0, alignment: .center)
.shadow(radius: 10.0)
Circle()
.fill(color)
.frame(width: recording ? 30.0 : 60.0, height: recording ? 30.0 : 60.0, alignment: .center) // <<: Here!
}
.onTapGesture { recording.toggle() }
.animation(.easeInOut, value: recording)
.onChange(of: recording) { newValue in if newValue { colorFunction() } else { color = Color.blue } }
}
func colorFunction() {
if (color != Color.red) { color = Color.red } else { color = Color.clear }
DispatchQueue.main.asyncAfter(deadline: .now() + .seconds(1)) { if recording { colorFunction() } }
}
}
Спасибо, по-видимому, моя ошибка, когда я делал это, не использовал самозапись.