★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
➤微信公众号:山青咏芝(shanqingyongzhi)
➤博客园地址:山青咏芝(www.zengqiang.org)
➤GitHub地址:https://github.com/strengthen/LeetCode
➤原文地址:https://www.cnblogs.com/strengthen/p/11398892.html
➤如果链接不是山青咏芝的博客园地址,则可能是爬取作者的文章。
➤原文已修改更新!强烈建议点击原文地址阅读!支持作者!支持原创!
★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
使用SwiftUI时,无论效果在何处,您都可以单独为视图或视图的状态设置动画。SwiftUI为您处理这些组合,重叠和可中断动画的所有复杂性。
在本教程中,您将为包含图表的视图设置动画,以跟踪用户在使用Google地标应用时所做的加息。使用animation(_:)
修改器,您将看到为视图设置动画是多么容易。
下载入门项目并按照本教程进行操作,或打开已完成的项目并自行探索代码。
一、将动画添加到单个视图
在animation(_:)
视图上使用修改器时,SwiftUI会对视图的可动画属性进行任何更改动画。视图的颜色,不透明度,旋转,大小和其他属性都是可动画的。
第1步
在,打开实时预览并试验显示和隐藏图形。HikeView.swift
请务必在本教程中使用实时预览,以便您可以尝试每个步骤的结果。
第2步
通过添加启用按钮旋转的动画。animation(.easeInOut())
1 import SwiftUI 2 3 struct HikeView: View { 4 var hike: Hike 5 @State private var showDetail = false 6 7 var body: some View { 8 VStack { 9 HStack { 10 HikeGraph(data: hike.observations, path: .elevation) 11 .frame( 50, height: 30) 12 13 VStack(alignment: .leading) { 14 Text(hike.name) 15 .font(.headline) 16 Text(hike.distanceText) 17 } 18 19 Spacer() 20 21 Button(action: { 22 self.showDetail.toggle() 23 }) { 24 Image(systemName: "chevron.right.circle") 25 .imageScale(.large) 26 .rotationEffect(.degrees(showDetail ? 90 : 0)) 27 28 .scaleEffect(showDetail ? 1.5 : 1) 29 .padding() 30 31 } 32 } 33 34 if showDetail { 35 HikeDetail(hike: hike) 36 } 37 } 38 } 39 }
第3步
通过在图形可见时使按钮变大来添加另一个可动画更改。
该animation(_:)
修改适用于它包装的意见中的所有动画的变化。
1 Button(action: { 2 self.showDetail.toggle() 3 }) { 4 Image(systemName: "chevron.right.circle") 5 .imageScale(.large) 6 .rotationEffect(.degrees(showDetail ? 90 : 0)) 7 .scaleEffect(showDetail ? 1.5 : 1) 8 .padding() 9 .animation(.easeInOut())
第4步
将动画类型更改为。easeInOut()
spring()
SwiftUI包括带有预定义或自定义缓动的基本动画,以及弹簧和流体动画。您可以调整动画的速度,在动画开始之前设置延迟,或指定动画重复。
1 Button(action: { 2 self.showDetail.toggle() 3 }) { 4 Image(systemName: "chevron.right.circle") 5 .imageScale(.large) 6 .rotationEffect(.degrees(showDetail ? 90 : 0)) 7 .scaleEffect(showDetail ? 1.5 : 1) 8 .padding() 9 .animation(.spring())
第5步
尝试通过在修改器上方添加另一个动画修改器来关闭旋转动画。scaleEffect
实验
以SwiftUI为旋转。尝试结合不同的动画效果,看看有什么可能。
1 Button(action: { 2 self.showDetail.toggle() 3 }) { 4 Image(systemName: "chevron.right.circle") 5 .imageScale(.large) 6 .rotationEffect(.degrees(showDetail ? 90 : 0)) 7 .animation(nil) 8 .scaleEffect(showDetail ? 1.5 : 1) 9 .padding() 10 .animation(.spring()) 11 }
第6步
animation(_:)
在继续下一部分之前删除两个修改器。
1 Button(action: { 2 self.showDetail.toggle() 3 }) { 4 Image(systemName: "chevron.right.circle") 5 .imageScale(.large) 6 .rotationEffect(.degrees(showDetail ? 90 : 0)) 7 8 .scaleEffect(showDetail ? 1.5 : 1) 9 .padding() 10 11 }
二、动态国家变化的影响
现在您已经学习了如何将动画应用于各个视图,现在是时候在更改状态值的位置添加动画了。
在这里,您将动画应用于用户点击按钮并切换状态属性时发生的所有更改。showDetail
第1步
裹调用与该呼叫功能。showDetail.toggle()
withAnimation
受属性影响的两个视图- 公开按钮和视图 - 现在都有动画过渡。showDetail
HikeDetail
减慢动画,看看SwiftUI动画是如何可以中断的。
1 Swift文件图标HikeView.swift 2 import SwiftUI 3 4 struct HikeView: View { 5 var hike: Hike 6 @State private var showDetail = false 7 8 var body: some View { 9 VStack { 10 HStack { 11 HikeGraph(data: hike.observations, path: .elevation) 12 .frame( 50, height: 30) 13 14 VStack(alignment: .leading) { 15 Text(hike.name) 16 .font(.headline) 17 Text(hike.distanceText) 18 } 19 20 Spacer() 21 22 Button(action: { 23 withAnimation(.easeInOut(duration: 4)) { 24 self.showDetail.toggle() 25 } 26 }) { 27 Image(systemName: "chevron.right.circle") 28 .imageScale(.large) 29 .rotationEffect(.degrees(showDetail ? 90 : 0)) 30 .scaleEffect(showDetail ? 1.5 : 1) 31 .padding() 32 } 33 } 34 35 if showDetail { 36 HikeDetail(hike: hike) 37 } 38 } 39 } 40 }
第2步
将4秒长的basic
动画传递给该功能。withAnimation
您可以将相同类型的动画传递给传递给修改器的函数。withAnimation
animation(_:)
1 Button(action: { 2 withAnimation(.easeInOut(duration: 4)) { 3 self.showDetail.toggle() 4 } 5 }) { 6 Image(systemName: "chevron.right.circle") 7 .imageScale(.large) 8 .rotationEffect(.degrees(showDetail ? 90 : 0)) 9 .scaleEffect(showDetail ? 1.5 : 1) 10 .padding() 11 }
第3步
尝试在动画中期打开和关闭图表视图。
第4步
在继续下一部分之前,从函数调用中删除慢动画。withAnimation
1 Button(action: { 2 withAnimation { 3 self.showDetail.toggle() 4 } 5 }) { 6 Image(systemName: "chevron.right.circle") 7 .imageScale(.large) 8 .rotationEffect(.degrees(showDetail ? 90 : 0)) 9 .scaleEffect(showDetail ? 1.5 : 1) 10 .padding() 11 }
三、自定义视图过渡
默认情况下,视图通过淡入和淡出过渡到屏幕上和屏幕外。您可以使用transition(_:)
修改器自定义此过渡。
第1步
添加transition(_:)
修饰符到条件可见。HikeView
现在图表出现并通过滑入和滑出而消失。
1 import SwiftUI 2 3 struct HikeView: View { 4 var hike: Hike 5 @State private var showDetail = false 6 7 var body: some View { 8 VStack { 9 HStack { 10 HikeGraph(data: hike.observations, path: .elevation) 11 .frame( 50, height: 30) 12 13 VStack(alignment: .leading) { 14 Text(hike.name) 15 .font(.headline) 16 Text(hike.distanceText) 17 } 18 19 Spacer() 20 21 Button(action: { 22 withAnimation { 23 self.showDetail.toggle() 24 } 25 }) { 26 Image(systemName: "chevron.right.circle") 27 .imageScale(.large) 28 .rotationEffect(.degrees(showDetail ? 90 : 0)) 29 .scaleEffect(showDetail ? 1.5 : 1) 30 .padding() 31 } 32 } 33 34 if showDetail { 35 HikeDetail(hike: hike) 36 .transition(.slide) 37 } 38 } 39 } 40 }
第2步
将转换提取为静态属性。AnyTransition
这可以在您展开自定义转换时保持代码清洁。对于自定义过渡,您可以使用与SwiftUI包含的相同的点符号。
1 import SwiftUI 2 3 extension AnyTransition { 4 static var moveAndFade: AnyTransition { 5 AnyTransition.slide 6 } 7 } 8 9 struct HikeView: View { 10 var hike: Hike 11 @State private var showDetail = false 12 13 var body: some View { 14 VStack { 15 HStack { 16 HikeGraph(data: hike.observations, path: .elevation) 17 .frame( 50, height: 30) 18 19 VStack(alignment: .leading) { 20 Text(hike.name) 21 .font(.headline) 22 Text(hike.distanceText) 23 } 24 25 Spacer() 26 27 Button(action: { 28 withAnimation { 29 self.showDetail.toggle() 30 } 31 }) { 32 Image(systemName: "chevron.right.circle") 33 .imageScale(.large) 34 .rotationEffect(.degrees(showDetail ? 90 : 0)) 35 .scaleEffect(showDetail ? 1.5 : 1) 36 .padding() 37 } 38 } 39 40 if showDetail { 41 HikeDetail(hike: hike) 42 .transition(.moveAndFade) 43 } 44 } 45 } 46 }
第3步
切换到使用move(edge:)
过渡,以便图表从同一侧滑入和滑出。
1 extension AnyTransition { 2 static var moveAndFade: AnyTransition { 3 AnyTransition.move(edge: .trailing) 4 } 5 }
第4步
使用修改器为视图显示和消失时提供不同的过渡。asymmetric(insertion:removal:)
1 import SwiftUI 2 3 extension AnyTransition { 4 static var moveAndFade: AnyTransition { 5 let insertion = AnyTransition.move(edge: .trailing) 6 .combined(with: .opacity) 7 let removal = AnyTransition.scale 8 .combined(with: .opacity) 9 return .asymmetric(insertion: insertion, removal: removal) 10 } 11 } 12 13 struct HikeView: View { 14 var hike: Hike 15 @State private var showDetail = false 16 17 var body: some View { 18 VStack { 19 HStack { 20 HikeGraph(data: hike.observations, path: .elevation) 21 .frame( 50, height: 30) 22 23 VStack(alignment: .leading) { 24 Text(hike.name) 25 .font(.headline) 26 Text(hike.distanceText) 27 } 28 29 Spacer() 30 31 Button(action: { 32 withAnimation { 33 self.showDetail.toggle() 34 } 35 }) { 36 Image(systemName: "chevron.right.circle") 37 .imageScale(.large) 38 .rotationEffect(.degrees(showDetail ? 90 : 0)) 39 .scaleEffect(showDetail ? 1.5 : 1) 40 .padding() 41 } 42 } 43 44 if showDetail { 45 HikeDetail(hike: hike) 46 .transition(.moveAndFade) 47 } 48 } 49 } 50 }