区块链技术博客
www.b2bchain.cn

WWDC 17-230 & 16-216 UIKit Animations求职学习资料

本文介绍了WWDC 17-230 & 16-216 UIKit Animations求职学习资料,有助于帮助完成毕业设计以及求职,是一篇很好的资料。

对技术面试,学习经验等有一些体会,在此分享。

2017-230 Advanced Animations with UIKit

WWDC原文,这篇博客权当做一下翻译

首先吹了一波UIViewPropertyAnimator:

UIView做动画:

UIView.animate(withDuration: 3.0, animations: {             self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)         })

进阶版UIViewPropertyAnimator做动画

animator2 = UIViewPropertyAnimator(duration: 3, curve: .easeIn, animations: {             self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)             }) animator2?.startAnimation()

下面讲一下关于动画曲线的

上面的.easeIn就是曲线的一种,常用的还有.easeOut .linear easeInOut

    public enum AnimationCurve : Int {         case easeInOut = 0         case easeIn = 1         case easeOut = 2         case linear = 3     }

linear线性,动画速度恒定:
<img src=”https://images.xiaozhuanlan.com/photo/2020/6ed7e35a6496656b8f9b000f71bf6b76.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeIn,开始很”ease”,表示开始比较慢,后来加快:
<img src=”https://images.xiaozhuanlan.com/photo/2020/d5b34f78e6397b374a5cb6f4a9ff6dff.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeOut,最后很”ease”,表示开始比较快,后来变慢
<img src=”https://images.xiaozhuanlan.com/photo/2020/61d0833c9c7b906d9102171e9423f160.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeInOut,开始最后都很”ease”,表示中间比较快,开始最后比较慢
<img src=”https://images.xiaozhuanlan.com/photo/2020/be733b1a6dcec11cffc1e967fa89a6b1.png” alt=”图片替换文本” width=”300″ height=”300″ />

然后又讲了中断与继续动画的实现

场景一:左右滑动滑块,松手以特定动画的最后一段路径来结束

 func handlePan(_ recognizer: UIPanGestureRecognizer) {         switch recognizer.state {         case .began:             animator = UIViewPropertyAnimator(duration: 1, curve: .easeIn, animations: {                 self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)             })             animator.pauseAnimation()         case .changed:             let translation = recognizer.translation(in: redV!)             print("translation:(translation)")             animator?.fractionComplete = translation.y / 300         case .ended:             animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)         default :             print("nothing")         }     }

注意:创建animator后马上pause动画是有目的的,苹果官方文档也有写

因为动画分为三个状态:

WWDC 17-230 &amp; 16-216 UIKit Animations

所以把只有把动画标记为Active状态,下面的continueAnimation才能正确执行

但上面这个图有很多误解,下面是一些注意点:

  1. Active状态下不能直接调用finishAnimation,会Crash
  2. Active*直接转换*Inactive只有两种方式:一是完成动画,会自动转换状态(特殊的,当在运行中调用isReverse=true后,会反向执行动画,会到起点后仍会变成InActive);二是调用stopAnimation(true)强行终止并转换成Inactive
  3. Active下调用stopAnimation(false)会使状态变为Stop,再调用finishAnimation转成Inactive
  4. finishAnimation有个参数,可以传.start | .current | .end,分别表示把UI状态变为起点、当前状态和动画终止时的状态;finishAnimation只能在stop状态下调用
  5. startAnimation后动画转成Active,然后pauseAnimation使isRunning变为false,但状态仍是Active

关注点还有滑块如何滑动

panGesture里的changed状态,调用了animator?.fractionComplete = translation.y / 300,这时会将滑块UI状态变为该完成度所在的状态

特殊的,如果想暂停动画再继续和之前设定的动画曲线不同怎么办

看到animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)里有withTimingParameters这个参数,可以换成另一个曲线:

let timing = UICubicTimingParameters(animationCurve: .easeInOut) animator2!.continueAnimation(withTimingParameters: timing, durationFactor: 0)

这里还有一个点要注意的,就是继续点是按照路程统一的,因为切换的时候只有保证UI一致(比如位置)才不会产生突变:
WWDC 17-230 &amp; 16-216 UIKit Animations

比如上面的图,一开始曲线是easeIn,continue之后会沿着曲线到easeOut对应点的位置

2016-216 Advances in UIKit Animations and Transitions

WWDC原视频

主要讲了新推出的UIViewPropertyAnimator

先是UIViewPropertyAnimator继承了两个协议:UIViewAnimating & UIViewImplicitlyAnimating

UIViewPropertyAnimator对上面两个尤其是后面一个协议做了私有实现,下面是demo:

        greenV = UIView(frame: CGRect(x: 120, y: 50, width: 50, height: 50))         greenV?.backgroundColor = .green         view.addSubview(greenV!)          let timing = UICubicTimingParameters(animationCurve: .easeOut)         let greenAnim = UIViewPropertyAnimator(duration: 3.0, timingParameters: timing)         greenAnim.addAnimations {             self.greenV!.frame = self.greenV!.frame.offsetBy(dx: 0, dy: 300)             self.greenV!.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))             self.greenV!.backgroundColor = .red         }         greenAnim.addCompletion { _ in             print("green is good")         }          greenAnim.startAnimation()

和最上面的那个demo没有区别

再给一个比较骚的demo,isReverse更改target status 继续动画的行为表现不同

如果startAnimation后,调用isReverse=true,会沿着动画曲线原路返回

如果startAnimation后,更改了动画的target状态,会发生如下行为:

WWDC 17-230 &amp; 16-216 UIKit Animations

        greenAnim?.addAnimations {             self.greenV!.frame = self.greenV!.frame.offsetBy(dx: 0, dy: 300)             self.greenV!.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))             self.greenV!.backgroundColor = .red         }          greenAnim?.startAnimation()         DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {             self.greenAnim?.addAnimations {                 self.greenV!.frame = CGRect(x: 120, y: 50, width: 50, height: 50)             }         }

上面的代码的表现就是进行到1.5s时会向反方向变化,但曲线形式还是easeOut,颜色和旋转还是原来定的target

未完待续。。。

2017-230 Advanced Animations with UIKit

WWDC原文,这篇博客权当做一下翻译

首先吹了一波UIViewPropertyAnimator:

UIView做动画:

UIView.animate(withDuration: 3.0, animations: {             self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)         })

进阶版UIViewPropertyAnimator做动画

animator2 = UIViewPropertyAnimator(duration: 3, curve: .easeIn, animations: {             self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)             }) animator2?.startAnimation()

下面讲一下关于动画曲线的

上面的.easeIn就是曲线的一种,常用的还有.easeOut .linear easeInOut

    public enum AnimationCurve : Int {         case easeInOut = 0         case easeIn = 1         case easeOut = 2         case linear = 3     }

linear线性,动画速度恒定:
<img src=”https://images.xiaozhuanlan.com/photo/2020/6ed7e35a6496656b8f9b000f71bf6b76.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeIn,开始很”ease”,表示开始比较慢,后来加快:
<img src=”https://images.xiaozhuanlan.com/photo/2020/d5b34f78e6397b374a5cb6f4a9ff6dff.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeOut,最后很”ease”,表示开始比较快,后来变慢
<img src=”https://images.xiaozhuanlan.com/photo/2020/61d0833c9c7b906d9102171e9423f160.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeInOut,开始最后都很”ease”,表示中间比较快,开始最后比较慢
<img src=”https://images.xiaozhuanlan.com/photo/2020/be733b1a6dcec11cffc1e967fa89a6b1.png” alt=”图片替换文本” width=”300″ height=”300″ />

然后又讲了中断与继续动画的实现

场景一:左右滑动滑块,松手以特定动画的最后一段路径来结束

 func handlePan(_ recognizer: UIPanGestureRecognizer) {         switch recognizer.state {         case .began:             animator = UIViewPropertyAnimator(duration: 1, curve: .easeIn, animations: {                 self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)             })             animator.pauseAnimation()         case .changed:             let translation = recognizer.translation(in: redV!)             print("translation:(translation)")             animator?.fractionComplete = translation.y / 300         case .ended:             animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)         default :             print("nothing")         }     }

注意:创建animator后马上pause动画是有目的的,苹果官方文档也有写

因为动画分为三个状态:

WWDC 17-230 &amp; 16-216 UIKit Animations

所以把只有把动画标记为Active状态,下面的continueAnimation才能正确执行

但上面这个图有很多误解,下面是一些注意点:

  1. Active状态下不能直接调用finishAnimation,会Crash
  2. Active*直接转换*Inactive只有两种方式:一是完成动画,会自动转换状态(特殊的,当在运行中调用isReverse=true后,会反向执行动画,会到起点后仍会变成InActive);二是调用stopAnimation(true)强行终止并转换成Inactive
  3. Active下调用stopAnimation(false)会使状态变为Stop,再调用finishAnimation转成Inactive
  4. finishAnimation有个参数,可以传.start | .current | .end,分别表示把UI状态变为起点、当前状态和动画终止时的状态;finishAnimation只能在stop状态下调用
  5. startAnimation后动画转成Active,然后pauseAnimation使isRunning变为false,但状态仍是Active

关注点还有滑块如何滑动

panGesture里的changed状态,调用了animator?.fractionComplete = translation.y / 300,这时会将滑块UI状态变为该完成度所在的状态

特殊的,如果想暂停动画再继续和之前设定的动画曲线不同怎么办

看到animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)里有withTimingParameters这个参数,可以换成另一个曲线:

let timing = UICubicTimingParameters(animationCurve: .easeInOut) animator2!.continueAnimation(withTimingParameters: timing, durationFactor: 0)

这里还有一个点要注意的,就是继续点是按照路程统一的,因为切换的时候只有保证UI一致(比如位置)才不会产生突变:
WWDC 17-230 &amp; 16-216 UIKit Animations

比如上面的图,一开始曲线是easeIn,continue之后会沿着曲线到easeOut对应点的位置

2016-216 Advances in UIKit Animations and Transitions

WWDC原视频

主要讲了新推出的UIViewPropertyAnimator

先是UIViewPropertyAnimator继承了两个协议:UIViewAnimating & UIViewImplicitlyAnimating

UIViewPropertyAnimator对上面两个尤其是后面一个协议做了私有实现,下面是demo:

        greenV = UIView(frame: CGRect(x: 120, y: 50, width: 50, height: 50))         greenV?.backgroundColor = .green         view.addSubview(greenV!)          let timing = UICubicTimingParameters(animationCurve: .easeOut)         let greenAnim = UIViewPropertyAnimator(duration: 3.0, timingParameters: timing)         greenAnim.addAnimations {             self.greenV!.frame = self.greenV!.frame.offsetBy(dx: 0, dy: 300)             self.greenV!.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))             self.greenV!.backgroundColor = .red         }         greenAnim.addCompletion { _ in             print("green is good")         }          greenAnim.startAnimation()

和最上面的那个demo没有区别

再给一个比较骚的demo,isReverse更改target status 继续动画的行为表现不同

如果startAnimation后,调用isReverse=true,会沿着动画曲线原路返回

如果startAnimation后,更改了动画的target状态,会发生如下行为:

WWDC 17-230 &amp; 16-216 UIKit Animations

        greenAnim?.addAnimations {             self.greenV!.frame = self.greenV!.frame.offsetBy(dx: 0, dy: 300)             self.greenV!.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))             self.greenV!.backgroundColor = .red         }          greenAnim?.startAnimation()         DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {             self.greenAnim?.addAnimations {                 self.greenV!.frame = CGRect(x: 120, y: 50, width: 50, height: 50)             }         }

上面的代码的表现就是进行到1.5s时会向反方向变化,但曲线形式还是easeOut,颜色和旋转还是原来定的target

未完待续。。。

2017-230 Advanced Animations with UIKit

WWDC原文,这篇博客权当做一下翻译

首先吹了一波UIViewPropertyAnimator:

UIView做动画:

UIView.animate(withDuration: 3.0, animations: {             self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)         })

进阶版UIViewPropertyAnimator做动画

animator2 = UIViewPropertyAnimator(duration: 3, curve: .easeIn, animations: {             self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)             }) animator2?.startAnimation()

下面讲一下关于动画曲线的

上面的.easeIn就是曲线的一种,常用的还有.easeOut .linear easeInOut

    public enum AnimationCurve : Int {         case easeInOut = 0         case easeIn = 1         case easeOut = 2         case linear = 3     }

linear线性,动画速度恒定:
<img src=”https://images.xiaozhuanlan.com/photo/2020/6ed7e35a6496656b8f9b000f71bf6b76.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeIn,开始很”ease”,表示开始比较慢,后来加快:
<img src=”https://images.xiaozhuanlan.com/photo/2020/d5b34f78e6397b374a5cb6f4a9ff6dff.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeOut,最后很”ease”,表示开始比较快,后来变慢
<img src=”https://images.xiaozhuanlan.com/photo/2020/61d0833c9c7b906d9102171e9423f160.png” alt=”图片替换文本” width=”300″ height=”300″ />

easeInOut,开始最后都很”ease”,表示中间比较快,开始最后比较慢
<img src=”https://images.xiaozhuanlan.com/photo/2020/be733b1a6dcec11cffc1e967fa89a6b1.png” alt=”图片替换文本” width=”300″ height=”300″ />

然后又讲了中断与继续动画的实现

场景一:左右滑动滑块,松手以特定动画的最后一段路径来结束

 func handlePan(_ recognizer: UIPanGestureRecognizer) {         switch recognizer.state {         case .began:             animator = UIViewPropertyAnimator(duration: 1, curve: .easeIn, animations: {                 self.redV!.frame = self.redV!.frame.offsetBy(dx: 0, dy: 300)             })             animator.pauseAnimation()         case .changed:             let translation = recognizer.translation(in: redV!)             print("translation:(translation)")             animator?.fractionComplete = translation.y / 300         case .ended:             animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)         default :             print("nothing")         }     }

注意:创建animator后马上pause动画是有目的的,苹果官方文档也有写

因为动画分为三个状态:

WWDC 17-230 &amp; 16-216 UIKit Animations

所以把只有把动画标记为Active状态,下面的continueAnimation才能正确执行

但上面这个图有很多误解,下面是一些注意点:

  1. Active状态下不能直接调用finishAnimation,会Crash
  2. Active*直接转换*Inactive只有两种方式:一是完成动画,会自动转换状态(特殊的,当在运行中调用isReverse=true后,会反向执行动画,会到起点后仍会变成InActive);二是调用stopAnimation(true)强行终止并转换成Inactive
  3. Active下调用stopAnimation(false)会使状态变为Stop,再调用finishAnimation转成Inactive
  4. finishAnimation有个参数,可以传.start | .current | .end,分别表示把UI状态变为起点、当前状态和动画终止时的状态;finishAnimation只能在stop状态下调用
  5. startAnimation后动画转成Active,然后pauseAnimation使isRunning变为false,但状态仍是Active

关注点还有滑块如何滑动

panGesture里的changed状态,调用了animator?.fractionComplete = translation.y / 300,这时会将滑块UI状态变为该完成度所在的状态

特殊的,如果想暂停动画再继续和之前设定的动画曲线不同怎么办

看到animator?.continueAnimation(withTimingParameters: nil, durationFactor: 0)里有withTimingParameters这个参数,可以换成另一个曲线:

let timing = UICubicTimingParameters(animationCurve: .easeInOut) animator2!.continueAnimation(withTimingParameters: timing, durationFactor: 0)

这里还有一个点要注意的,就是继续点是按照路程统一的,因为切换的时候只有保证UI一致(比如位置)才不会产生突变:
WWDC 17-230 &amp; 16-216 UIKit Animations

比如上面的图,一开始曲线是easeIn,continue之后会沿着曲线到easeOut对应点的位置

2016-216 Advances in UIKit Animations and Transitions

WWDC原视频

主要讲了新推出的UIViewPropertyAnimator

先是UIViewPropertyAnimator继承了两个协议:UIViewAnimating & UIViewImplicitlyAnimating

UIViewPropertyAnimator对上面两个尤其是后面一个协议做了私有实现,下面是demo:

        greenV = UIView(frame: CGRect(x: 120, y: 50, width: 50, height: 50))         greenV?.backgroundColor = .green         view.addSubview(greenV!)          let timing = UICubicTimingParameters(animationCurve: .easeOut)         let greenAnim = UIViewPropertyAnimator(duration: 3.0, timingParameters: timing)         greenAnim.addAnimations {             self.greenV!.frame = self.greenV!.frame.offsetBy(dx: 0, dy: 300)             self.greenV!.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))             self.greenV!.backgroundColor = .red         }         greenAnim.addCompletion { _ in             print("green is good")         }          greenAnim.startAnimation()

和最上面的那个demo没有区别

再给一个比较骚的demo,isReverse更改target status 继续动画的行为表现不同

如果startAnimation后,调用isReverse=true,会沿着动画曲线原路返回

如果startAnimation后,更改了动画的target状态,会发生如下行为:

WWDC 17-230 &amp; 16-216 UIKit Animations

        greenAnim?.addAnimations {             self.greenV!.frame = self.greenV!.frame.offsetBy(dx: 0, dy: 300)             self.greenV!.transform = CGAffineTransform(rotationAngle: CGFloat(Double.pi/2))             self.greenV!.backgroundColor = .red         }          greenAnim?.startAnimation()         DispatchQueue.main.asyncAfter(deadline: .now() + 1.5) {             self.greenAnim?.addAnimations {                 self.greenV!.frame = CGRect(x: 120, y: 50, width: 50, height: 50)             }         }

上面的代码的表现就是进行到1.5s时会向反方向变化,但曲线形式还是easeOut,颜色和旋转还是原来定的target

未完待续。。。

部分转自互联网,侵权删除联系

赞(0) 打赏
部分文章转自网络,侵权联系删除b2bchain区块链学习技术社区 » WWDC 17-230 & 16-216 UIKit Animations求职学习资料
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

b2b链

联系我们联系我们