struct PlayerView: View {
@State private var isPlaying: Bool = false
var body: some View {
// ...
}
}
Button(action: {
self.isPlaying.toggle()
}) {
Image(systemName: isPlaying ? "pause.circle" : "play.circle")
}
struct PlayerView: View {
let episode: Episode // The queued episode.
@State private var isPlaying: Bool = false
var body: some View {
VStack {
// Display information about the episode.
Text(episode.title)
Text(episode.showTitle)
Button(action: {
self.isPlaying.toggle()
}) {
Image(systemName: isPlaying ? "pause.circle" : "play.circle")
}
}
}
}
struct PlayButton: View {
@Binding var isPlaying: Bool
var body: some View {
Button(action: {
self.isPlaying.toggle()
}) {
Image(systemName: isPlaying ? "pause.circle" : "play.circle")
}
}
}
struct PlayerView: View {
var episode: Episode
@State private var isPlaying: Bool = false
var body: some View {
VStack {
Text(episode.title)
Text(episode.showTitle)
PlayButton(isPlaying: $isPlaying) // Pass a binding.
}
}
}
$ 접두사는 상태에 대해 기본 저장소에 대한 바인딩인 projectedValue에 대한 래핑된 속성을 요청한다.
마찬가지로 $ 접두사를 사용하여 바인딩에서 바인딩을 가져올 수 있으므로 임의의 수의 뷰 계층 구조 수준을 통해 바인딩을 전달할 수 있다.
상태 변수 내에서 범위가 지정된 값에 대한 바인딩을 가져올 수도 있다.
예를들어, 플레이어의 상위 뷰에서 에피소드를 상태 변수로 선언하고 에피소드 구조에 토글로 제어하려는 isFavorite 부울도 포함되어 있는 경우, $episode.isFavorite
를 참조하여 에피소드의 즐겨찾기 상태에 대한 바인딩을 얻을 수 있다.
struct Podcaster: View {
@State private var episode = Episode(title: "Some Episode",
showTitle: "Great Show",
isFavorite: false)
var body: some View {
VStack {
Toggle("Favorite", isOn: $episode.isFavorite) // Bind to the Boolean.
PlayerView(episode: episode)
}
}
}
withAnimation(.easeInOut(duration: 1)) {
self.isPlaying.toggle()
}
Image(systemName: isPlaying ? "pause.circle" : "play.circle")
.scaleEffect(isPlaying ? 1 : 1.5)
SwiftUI는 지정된 곡선과 지속 시간을 사용하거나 아무것도 제공하지 않는 경우 합리적인 기본값을 사용하여 주어진 값 1과 1.5 사이에서 시간에 따라 크기 조정 효과 입력을 전환한다.
반면에 동일한 Boolean이 표시할 시스템 이미지를 지정하더라도 이미지 콘텐츠는 애니메이션의 영향을 받지 않습니다.
이는 SwiftUI가 두 문자열 Pause.circle과 play.circle 사이에서 의미 있는 방식으로 점진적으로 전환할 수 없기 때문다.
state 프로퍼티에 애니메이션을 추가하거나 위의 예와 같이 binding에 애니메이션을 추가할 수 있다.
어느 쪽이든, SwiftUI는 기본 저장된 값이 변경될 때 발생하는 모든 뷰 변경에 애니메이션을 적용
예를 들어, PlayerView(애니메이션 블록 위치 위의 뷰 계층 구조 수준)에 배경색을 추가하면 SwiftUI도 이에 애니메이션을 적용한다.
VStack {
Text(episode.title)
Text(episode.showTitle)
PlayButton(isPlaying: $isPlaying)
}
.background(isPlaying ? Color.green : Color.red) // Transitions with animation.
역시 공식문서 따라가기가 제일 맘편하다.. 역시 근본..