当前位置:   article > 正文

IOS 开发高手课 学习笔记(第三部分)_libffi、ffcall

libffi、ffcall

这一部分戴铭老师说的是一些底层的东西,然后推荐了一下第三方库,但是看同学者的反应,很多内容(主要是推荐的第三方库)都不是很完善(不能完全接受),所以这部分内容,要谨慎对待,然后自己实践和查询足够的资料后,再选择接受相关内容。正所谓,尽信书不如无书,这部分内容最能反应这个观点。当然这不是否认戴老师的功劳,至少在眼界方面,学习之后得到了很大的扩宽!

Part 1. 除了 Cocoa,iOS还可以用哪些 GUI 框架开发?

在 iOS 开发时,默认使用的都是系统自带的 Cocoa Touch 框架,所以如果你还想进一步提高界面响应速度,赶超其他使用 Cocoa Touch 框架的 App 用户体验时,就要考虑使用其他的 GUI 框架来优化 App 界面的响应速度了。
现在流行的 GUI 框架除了 Cocoa Touch 外,还有 WebKit、Flutter、Texture(原名 AsyncDisplayKit)、Blink、Android GUI 等。其中,WebKit、Flutter、Texture 可以用于 iOS 开发。

Texture 框架,正是建立在 Cocoa Touch 框架之上的。Texture 和其他 GUI 框架一样都是使用的应用更加广泛的 FlexBox 布局。另外,Texture 是这些框架中唯一使用异步节点计算的框架。
基于以上三个方面的原因,如果要从 Cocoa Touch 框架前移到其他的 GUI 框架,从学习成本、收益等角度考虑的话,转到 Texture 会是个不错的选择。
Texture 最大的优势就是开发了线程安全的 ASDisplayNode,而且还能够很好的和 UIView 共生。

  • 实践,用Texture 实现UI

Part 2. 细说 iOS 响应式框架变迁,哪些思想可以为我所用?

说到 iOS 响应式框架,最开始被大家知道的是 ReactiveCocoa(简称 RAC),后来比较流行的是 RxSwift。但据我了解,iOS 原生开发使用 ReactiveCocoa 框架的团队并不多,而前端在推出 React.js 后,响应式思路遍地开花。那么,响应式框架到底是什么,为什么在 iOS 原生开发中没被广泛采用,却能在前端领域得到推广呢?
ReactiveCocoa 框架并没有为 iOS 的 App 带来更好的性能。当一个框架可有可无,而且没有明显收益时,一般团队是没有理由去使用的。

从本质上看,响应式编程没能提高 App 的性能,是其没能流行起来的主要原因。在调试上,由于 ReactiveCocoa 框架采用了 Monad 模式,导致其底层实现过于复杂,从而在方法调用堆栈里很难去定位到问题。这,也是 ReactiveCocoa 没能流行起来的一个原因。但, ReactiveCocoa 的上层接口设计思想,可以用来提高代码维护的效率,还是可以引入到 iOS 开发中的(DEMO:https://github.com/ming1016/RACStudy.git)。ReactiveCocoa 里面还有很多值得我们学习的地方,比如说宏的运用
对于 iOS 开发来说,响应式编程还有一个很重要的技术是 KVO,使用 KVO 来实现响应式开发的范例可以参考戴老师以前的一个 demo

Part 3. 如何构造酷炫的物理效果和过场动画效果?

Lottie
Lottie 框架就很好地解决了动画制作与开发隔离,以及多平台统一的问题。
动画设计师做好动画以后,可以使用After Effects将动画导出成 JSON 文件,然后由 Lottie 加载和渲染这个 JSON 文件,并转换成对应的动画代码。由于是 JSON 格式,文件也会很小,可以减少 App 包大小。运行时还可以通过代码控制更改动画,比如更改颜色、位置以及任何关键值。另外,Lottie 还支持页面切换的过场动画(UIViewController Transitions)。

Bodymovin
你需要先到Adobe 官网下载 Bodymovin 插件,并在 After Effects 中安装。使用 After Effects 制作完动画后,选择 Windows 菜单,找到 Extensions 的 Bodymovin 项,在菜单中选择 Render 按钮就可以输出 JSON 文件了。

在 iOS 中使用 Lottie
在 iOS 开发中使用 Lottie 也很简单,只要集成 Lottie 框架,然后在程序中通过 Lottie 的接口控制 After Effects 生成的动画 JSON 就行了。首先,你可以通过 CocoaPods 集成 Lottie 框架到你工程中。Lottie iOS 框架的 GitHub 地址是https://github.com/airbnb/lottie-ios/,官方也提供了可供学习的示例。然后,快速读取一个由 Bodymovin 生成的 JSON 文件进行播放。具体代码如下所示:

pod 'lottie-ios', '=2.5.2'

- (void)testLottieAnimation{
   
    aniView = [LOTAnimationView animationNamed:@"lf20_0y27xv96"];
    aniView.loopAnimation = YES;
    [self.view addSubview:aniView];
    [aniView play];
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

备注:免费的动画json,可以从lottiefiles这里下载

利用 Lottie 的动画进度控制能力,还可以完成手势与动效同步的问题。动画进度控制是 LOTAnimationView 的 animationProgress 属性,设置属性的示例代码如下:

CGPoint translation = [gesture getTranslationInView:self.view];
CGFloat progress = translation.y / self.view.bounds.size.height;
animationView.animationProgress = progress;
  • 1
  • 2
  • 3

Lottie 还带有一个 UIViewController animation-controller
可以自定义页面切换的过场动画,示例代码如下:


#pragma mark -- 定制转场动画

// 代理返回推出控制器的动画
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForPresentedController:(UIViewController *)presented presentingController:(UIViewController *)presenting sourceController:(UIViewController *)source {
   
  LOTAnimationTransitionController *animationController = [[LOTAnimationTransitionController alloc] initWithAnimationNamed:@"vcTransition1" fromLayerNamed:@"outLayer" toLayerNamed:@"inLayer" applyAnimationTransform:NO];
  return animationController;
}

// 代理返回退出控制器的动画
- (id<UIViewControllerAnimatedTransitioning>)animationControllerForDismissedController:(UIViewController *)dismissed {
   
  LOTAnimationTransitionController *animationController = [[LOTAnimationTransitionController alloc] initWithAnimationNamed:@"vcTransition2" fromLayerNamed:@"outLayer" toLayerNamed:@"inLayer" applyAnimationTransform:NO];
  return animationController;
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

多平台支持
Lottie 支持多平台,除了 支持iOS,还支持 Android 、React Native和Flut

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/291797
推荐阅读
相关标签
  

闽ICP备14008679号