首页 iOS.& Swift Books Swifui由教程

14
动画 由账单更多地德里菲尔德

一个好的应用,然后在小细节有很大的应用程序往往东南非共同市场之间的差异。使用正确的动画在合适的地方可以取悦用户,并让您的应用脱颖而出,在拥挤的App Store。

动画可以让你的应用更有趣的使用,他们可以在某些领域将用户的注意力发挥强大的作用。良好的动画让你的应用程序更具吸引力,更容易使用。

Slowitui中的动画比Annite或Uikit在一起。 Swipuizets是更高级别的颠覆性,对您来说都是繁琐的工作。如果您在Apple平台中有一个带有An An An An Ane的Shed Expirink,很多章节第3页将SEM Farmarar。你会发现它在您的应用中提交很多。您可以在不小心的情况下打破动画和中断它们。国家管理的问候性的大部分复杂的框架与它交易框架。这令您释放您要使伟大的动画纠缠在于处理案例和复杂性。

在本章中,您将通过对示例项目的Nelogy动画的过程工作。是时候摇动了屏幕!

动画状态改变

首先,打开本章的入门项目。在Xcode 11或更高版本中构建并运行项目,您将看到一个应用程序,该应用程序显示机场的航班信息。列表提供了随着时间的推移和飞行将离开或到达的大门。

笔记:不幸的是,它是具有挑战性的显示打印页面上的动画。你会使用预览,模拟器或设备上需要合作,通过这一章。

添加动画

开始,打开 FlightBoardInformation.swift. 并寻找以下代码:

Button(action: {
 self.showDetails.toggle()
}) {
  HStack {
 if showDetails {
      Text("Hide Details")
      Spacer()
      Image(systemName: "chevron.up.square")
    } else {
      Text("Show Details")
      Spacer()
      Image(systemName: "chevron.down.square")
    }
  }
}
Button(action: {
 self.showDetails.toggle()
}) {
  HStack {
    Text(showDetails ? "Hide Details" : "Show Details")
    Spacer()
    Image(systemName: "chevron.up.square")
      .rotationEffect(.degrees(showDetails ? 0 : 180))
  }
}
Image(systemName: "chevron.up.square")
  .rotationEffect(.degrees(showDetails ? 0 : 180))
  .animation(.default)
.rotationEffect(.degrees(showDetails ? 0 : 180))

动画类型

到目前为止,您可以使用单一类型的动画:默认动画。 Swifui提供了更多的动画类型。差异可能是微妙的,很难看到小雪佛龙。要使更改更容易注意到,您将添加另一个动画到此视图。

动画细节视图

留在 FlightBoardInformation.swift.。要显示飞行细节的代码看起来如:

if showDetails {
  FlightDetails(flight: flight)
}
FlightDetails(flight: flight)
  .offset(x: showDetails ? 0 : -UIScreen.main.bounds.width)

默认动画

否则,您将更改为添加动画。偏移后,addd:

.animation(.default)

缓解动画

缓解动画可能是最常见的应用程序。缓释动画在动画的端点处应用加速度,减速或两者。它们通常看起来更加自然,因为不可能瞬间改变现实世界的速度。动画反映了真实世界运动的加速度或减速。

.animation(.easeOut)

.animation(.easeOut(duration: 2))

TimingCurve(CX0,Cy0,Cx1,Cy1)
SAGIGVLIZJE(BJ3,KG0,QZ8,SH9)

春天动画

缓解动画始终在一个方向上的开始和结束状态之间转换。他们也永远不会通过任何最终状态。其他类别的Swifui动画让您在状态更改结束时添加一点反弹。这种类型的动画的物理模型给出了这个名字:弹簧。

为什么春天发出一个有用的动画

弹簧抵抗拉伸和压缩。弹簧的拉伸或压缩越大,弹簧呈现的阻力越多。想象一下,你需要一个体重并将它连接到春天的一端。然后,将弹簧的另一端连接到一个固定点,并在底部的重量垂直地垂直落下弹簧。

创建春季动画

Now that you have a bit more understanding of how a spring animation works, you’ll see how these parameters affect your animation. The traditional spring animation you create with the interpolatingSpring(mass:stiffness:damping:initialVelocity:) method uses these parameters. Change the animation line to:

animation(.interpolatingSpring(mass: 1, stiffness: 100,
                                damping: 10, initialVelocity: 0))
.animation(.spring(response: 0.55, dampingFraction: 0.45,
                   blendDuration: 0))

删除和结合动画

There are times that you may apply modifications to a view, but you only want to animate some of them. You do this by passing a nil to the animation() method.

Button(action: {
 self.showDetails.toggle()
}) {
  HStack {
    Text(showDetails ? "Hide Details" : "Show Details")
    Spacer()
    Image(systemName: "chevron.up.square")
      .scaleEffect(showDetails ? 2 : 1)
      .rotationEffect(.degrees(showDetails ? 0 : 180))
      .animation(.easeInOut)
  }
}
Button(action: {
 self.showDetails.toggle()
}) {
  HStack {
    Text(showDetails ? "Hide Details" : "Show Details")
    Spacer()
    Image(systemName: "chevron.up.square")
      .scaleEffect(showDetails ? 2 : 1)
      .animation(.spring(response: 0.55, dampingFraction: 0.45,
                         blendDuration: 0))
      .rotationEffect(.degrees(showDetails ? 0 : 180))
      .animation(.easeInOut)
  }
}

从国家变化动画

To this point in the chapter, you’ve applied animations at the element of the view that changed. You can also apply the animation at the point where the state change occurs. When doing so, the animation applies to all changes that occur because of the state change. Modify the code for the Button and details view to:

Button(action: {
  withAnimation(.default) {
 self.showDetails.toggle()
  }
}) {
  HStack {
    Text(showDetails ? "Hide Details" : "Show Details")
    Spacer()
    Image(systemName: "chevron.up.square")
      .scaleEffect(showDetails ? 2 : 1)
      .rotationEffect(.degrees(showDetails ? 0 : 180))
  }
}
FlightDetails(flight: flight)
  .offset(x: showDetails ? 0 : -UIScreen.main.bounds.width)

调整动画

有共同所有的动画几个实例方法。这些方法让你延迟一个动画,改变动画的速度和重复动画。

延迟

The delay() method allows you to specify a time in seconds before the animation occurs. Change the spring animation added in the previous section so that the flight details view reads:

FlightDetails(flight: flight)
  .offset(x: showDetails ? 0 : -UIScreen.main.bounds.width)
  .animation(Animation.spring().delay(1))

速度

You use the .speed() method to change the speed of the animation. This modifier multiplies the speed of the animation by the value you provide. If you have an animation that originally takes two seconds and apply .speed(0.5), it will occur at half of the original speed and therefore take twice as long to complete. This change causes the animation to last four seconds. This modifier can be useful to adjust the time of an animation lacking a direct time element such as default and spring animations. It also works well to match the times of concurrent animations.

 .animation(Animation.spring().speed(2))

重复动画

To repeat an animation you call .repeatCount(_:autoreverses:) with the number of times the animation will repeat. You can also control if the animation reverses before repeating. Without reversing, the animation will return to the initial state instantaneously. With reversing, the animation goes back to the initial state before repeating. The repeatForever(autoreverses:) loops the animation forever, but you still specify if the animation should reverse before repeating.

.animation(Animation.spring()
           .repeatCount(2, autoreverses: false))
.animation(.spring())

从视图中提取动画

到目前为止,您已在视图中直接定义了动画。为了探索和学习,运作良好。在真实应用中,当您将代码的不同元素分开时,更容易维护代码。可以在视图之外定义动画,您可以在其中重用它们。在 FlightBoardInformation.swift., add the following code above the body structure:

var flightDetailAnimation : Animation {
  Animation.easeInOut
}
withAnimation(self.flightDetailAnimation) {

动画视图过渡

笔记:转换有时预览渲染不正确。如果你没有看到你所期望的,然后尝试在模拟器或设备上运行的应用程序。

if showDetails {
  FlightDetails(flight: flight)
    .transition(.slide)
}
Button(action: {
  withAnimation {
    self.showDetails.toggle()
  }
}) {
.animation(flightDetailAnimation)

查看过渡类型

你上面使用了幻灯片过渡。滑动过渡滑动通过滑动关闭后缘从前缘和叶片的视图。有几个其他过渡动画就可以使用。

.transition(.move(edge: .bottom))

从视图中提取过渡

您可以从那些动画的人那里改变你的过渡。你没有添加这个 塑造 级别作为WITT动画,但在文件范围内。在顶部 FlightBoardInformation.swift. add the following:

extension AnyTransition {
  static var flightDetailsTransition: AnyTransition {
    AnyTransition.slide
  }
}
if showDetails {
  FlightDetails(flight: flight)
    .transition(.flightDetailsTransition)
}

异步转换

SWIFTI ZOO特殊单独的过渡,加入和删除视图。将静态属性更改为:

extension AnyTransition {
  static var flightDetailsTransition: AnyTransition {
    let insertion = AnyTransition.move(edge: .trailing)
      .combined(with: .opacity)
    let removal = AnyTransition.scale(scale: 0.0)
      .combined(with: .opacity)
    return .asymmetric(insertion: insertion, removal: removal)
  }
}

挑战

挑战:改变航班详情视图

更改本章的最终项目,使飞行细节视图从前沿滑入。隐藏它时,将视图滑动到底部并逐渐消失。此外,更改按钮文本转换。添加后,按钮文本视图应从前沿移动。删除后,按钮文本视图应使用比例转换消失。

关键点

  • 不要对DOI的SAK嗤之以鼻。有欧元农动画的用途。
  • 保持长度0.25秒和1.0秒之间的动画。较短的动画往往并不明显。更长的动画冒险讨厌你的用户想要得到的东西完成。
  • 保持Animaruations咨询兄弟APP和使用平台安全。
  • 动画应该是可通量的。 resact辅助设置redce或lmateplimations。
  • 让一个动画在脸上,从一个人的一个国家到另一个州。
  • 如果明智地使用,动画可以在应用程序中产生巨大差异。

然后去哪儿?

本章的重点是如何创建动画和过渡,而不是为什么,以及如何岁才能使用研究。起点在苹果平台上的用户界面相关的问题一个很好的是人机界面指南在这里: //developer.apple.com/design/human-interface-guidelines/。 wwwd 2018年会话,设计流体界面,也详细介绍了Gerres和Motion在应用中,你可以看到,野兔: //developer.apple.com/videos/play/wwdc2018/803.

有一个技术问题?想报告一个错误吗? 您可以向我们的办公室书论坛中的书籍作者提出问题和报告错误 这里.

有反馈分享在线阅读体验吗? 如果您对UI,UX,高亮反馈,或者我们的在线读者的其他功能,您可以付款给设计团队与下面的表格:

© 2021 Razeware LLC

你是免费的阅读,这章节的部分是shht 混淆了 文本。解锁这一点,我们的整个书籍和视频目录,RaznderLine.com专业提交。

现在解锁

对Hightless或记笔记,您会致力于o Usumcrication或Pureahelf。