Я хочу, чтобы элемент управления исчезал, когда представление, в котором оно содержится, появляется впервые. Я пробовал все, но не повезло.
withAnimation(.default) {
Text("hey")
.transition(.opacity)
}
// as well as
Text("hey")
.transition(.opacity)
.animation(.default)
// and finally
@State var opacity:Double = 0.0
Text("hey")
.opacity(self.opacity)
.transition(.opacity)
.animation(.default)
[...]
.onAppear() {
self.opacity = 1.0
}
Я могу заставить анимацию работать, если представление становится видимым с помощью нажатия кнопки, которое изменяет значение self.opacity, и я полагаю, что вышеуказанные методы будут работать в целом, если элемент управления не должен отображаться изначально, но вставляется вместо.
Вот возможное решение (вы можете настроить параметры для достижения желаемого эффекта)
Протестировано с Xcode 12.1/iOS 14.1
struct DemoFadeInView: View {
@State var isShown = false
var body: some View {
VStack {
if isShown {
Text("hey")
.transition(.opacity)
}
}
.animation(Animation.easeInOut(duration: 1).delay(0.5)) // delay is optional, for demo
.onAppear() {
self.isShown.toggle()
}
}
}
1) вы можете связать анимацию по определенному значению, используя .animation(_, value:)
; 2) не применять анимацию к корневому представлению, а отделить его небольшими подвидами с собственной анимацией. ... и, кстати, это выходит за рамки первоначального вопроса;)
2) получилось! В основном то, что вы предложили в своем исходном решении, применялось к любому элементу управления, который я хочу, перемещая его как собственное подвид. Мне любопытна ваша рекомендация 1). Это альтернативный способ? Я не уверен, как вы можете связать значение модификатора и элемент управления в иерархии, в которой я хочу анимировать. Разъяснение приветствуется!
Спасибо Аспери! Но как быть, когда есть несколько элементов управления? Наличие модификатора анимации в элементе управления корневого контейнера означает, что все дочерние элементы также анимируются в поле зрения. И когда я попытался применить модификатор только к элементу управления Text, это не сработало.