当前位置:   article > 正文

跨平台布局引擎Yoga的学习和使用

yoga c++

一、相关网站

### 1.Yogalayout 主页  ### 2.支持的框架 安卓:fblitho主页   github地址 iOS: Componentkit github地址 React Native: React Native   github地址

3.参考文章:

参考文章1:【翻译】Yoga 教程: 使用跨平台布局引擎 参考文章2:Yoga 教程: 使用跨平台布局引擎

一、Yoga的发展

Yoga是一个基于Flexbox的跨平台布局引擎,能使布局工作更轻松。 Yoga 作为一个通用的布局系统,来代替iOS上的AutoLayout 或 web 上的 Cascading Style Sheets (CSS)。 最初是Facebook在2014年推出的一个CSS布局的开源库,2016年改版并更名为Yoga。Yoga 支持多个平台,包括 Java、C#、C 和 Swift。 库开发者可以集成Yoga到布局系统,就如 Facebook 已经集成进React Native/Litho/Componentkit。Yoga 也是一个 iOS 开发者可以直接用来布局视图的框架。

二、了解Flexbox

Flexbox 也称为 CSS Flexible Box,被创建用来处理 web 上的复杂布局。 一个关键特征是在给定方向上高效布局内容,并能“灵活”处理自身大小来适应一些空间。 Flexbox 由 flex 容器组成,每个含有一个或多个 flex 项目:如下图

Flexbox 定义 flex item 如何在一个 flex 容器里布局。Flex container之外和 flex item内部的内容会照常渲染。

Flexbox 允许指定Flex item在行与列上的定位和间隔。 对齐内容(justify-content)指定项目沿容器的行与列对齐。

flex-start:定位在容器的开端。 flex-end:定位在容器的末端。 center: 定位在容器的中间。 space-between:项目在容器内被空白空间均匀间隔开,第一个项目在开端位置,最后一个项目在末端位置。 space-around:项目周围以同等空间均匀间隔。 对齐项目(align-items)指定项目沿容器的横轴对齐。下图显示容器的 flex 方向为行时(这意味着横轴垂直运行)的项目展示位置:

项目在容器的开端、中间和末端垂直对齐。 以上初步的 Flexbox 属性应该让你感受了 Flexbox 的工作原理。 还有更多属性可供你使用。 有些控制项目依据可用容器空间来拉伸或收缩的方式。 另一些可以设置填充(padding)、边距(margin),甚至大小(size)。 Flex demo:http://runjs.cn/code/osns3yas

四、Yoga 对比Flexbox

Yoga 是基于 Flexbox 的,也有一些不同。 Yoga 并没有实现全部 CSS Flexbox。 它省略了非布局属性,如设置颜色。 Yoga 改进了一些 Flexbox 的属性来提供更好的从右到左的支持。 最后,Yoga 增加了一个新的比例(AspectRatio)属性来处理在布置某些元素如图片时常见的需求

五、使用YogaKit(OC/Swift)来构建布局

Yoga API 将使你沐浴在 Flexbox 熟悉度的余晖中。可以在 Swift app 布局中应用你学到的 Flexbox。 Yoga 使用 C 编写,主要关注于优化性能和简便集成到其它平台。 对于开发 iOS app,你将使用 YogaKit 工作,这是一个由 C 实现的封装包。 回顾 Flexbox 在 web 里的样例,布局是通过样式属性来配置的。 而 YogaKit,布局配置是交由 YGLayout 对象来完成。 YGLayout 包含的属性有 flex 方向,对齐内容,对齐项目,填充和边距。 YogaKit 曝露 YGLayout 作为 UIView 上的一个 Category。 这个 Category 添加 configureLayout(block:) 方法到 UIView。 将 YGLayout 参数传进block里,并使用这些信息来配置视图的布局属性。 通过使用所需的 Yoga 属性配置每个参与的视图来构建你的布局。 一旦完成,你在根视图的 YGLayout 上调用 applyLayout(preservingOrigin:)。 这会计算并应用布局到根视图和子视图。

1、布局代码

完整代码

Podfile文件内容

  1. platform :ios, '10.0'
  2. use_frameworks!
  3. target "YogaKitDemo" do
  4. pod 'Yoga', '~> 1.6.0' //yoga 使用c/c++实现
  5. pod 'YogaKit' //提供给Objective-C和Swift使用
  6. end
  7. 复制代码
  1. -(void)dodoViews
  2. {
  3. [self.view configureLayoutWithBlock:^(YGLayout * layout) {
  4. layout.isEnabled = YES;
  5. layout.width = YGPointValue(self.view.bounds.size.width);
  6. layout.height = YGPointValue(self.view.bounds.size.height);
  7. layout.alignItems = YGAlignCenter;
  8. }];
  9. UIView *contentView = [[UIView alloc]init];
  10. contentView.backgroundColor = [UIColor lightGrayColor];
  11. [contentView configureLayoutWithBlock:^(YGLayout * layout) {
  12. layout.isEnabled = true;
  13. // 4
  14. layout.flexDirection = YGFlexDirectionRow;
  15. layout.width = YGPointValue(320);
  16. layout.height = YGPointValue(80);
  17. layout.marginTop = YGPointValue(100);
  18. layout.padding = YGPointValue(10);//设置了全部子项目的填充值
  19. }];
  20. UIView *child1 = [[UIView alloc]init];
  21. child1.backgroundColor = [UIColor redColor];
  22. [child1 configureLayoutWithBlock:^(YGLayout * layout) {
  23. layout.isEnabled = YES;
  24. layout.width = YGPointValue(80);
  25. layout.marginRight = YGPointValue(10);
  26. }];
  27. UIView *child2 = [[UIView alloc]init];
  28. child2.backgroundColor = [UIColor blueColor];
  29. [child2 configureLayoutWithBlock:^(YGLayout * layout) {
  30. layout.isEnabled = YES;
  31. layout.width = YGPointValue(80);
  32. layout.flexGrow = 1;
  33. layout.height = YGPointValue(20);
  34. layout.alignSelf = YGAlignCenter;
  35. }];
  36. [contentView addSubview:child1];
  37. [contentView addSubview:child2];
  38. [self.view addSubview:contentView];
  39. [self.view.yoga applyLayoutPreservingOrigin:YES];
  40. }
  41. 复制代码

显示效果:

2、运行步骤

第1步:设置view的layout

configureLayoutWithBlock:(YGLayoutConfigurationBlock)block

第2步:将layout应用到view

applyLayoutPreservingOrigin:(BOOL)preserveOrigin

2-1:计算布局

calculateLayoutWithSize

2-2:将布局应用到view层级上

YGApplyLayoutToViewHierarchy

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

闽ICP备14008679号