ToB企服应用市场:ToB评测及商务社交产业平台

标题: iOS开辟框架--MyLayout [打印本页]

作者: 小秦哥    时间: 2024-10-20 20:08
标题: iOS开辟框架--MyLayout
MyLayout 框架不但支持  Objective-C,也可以在 Swift 中使用。通过 MyLayout,可以使用面向对象的方式来创建和管理视图的布局,简化了 Auto Layout 中繁琐的约束设置流程。在 Objective-C 中,MyLayout 提供了相同的布局类型和属性,使用方式稍有不同,主要是语法和调用方式上的差异。
先先容一下如何使用吧,线性布局和相对布局是用的比较多的布局方式。
1. 线性布局(MyLinearLayout)

线性布局是一种里面的子视图按添加的顺序从上到下或者从左到右依次分列的单列(单行)布局视图,因此里面的子视图是通过添加的顺序建立约束和依靠关系的。 子视图从上到下依次分列的线性布局视图称为垂直线性布局视图,而子视图从左到右依次分列的线性布局视图则称为程度线性布局
创建一个垂直线性布局的示例:
  1. MyLinearLayout *rootLayout = [MyLinearLayout linearLayoutWithOrientation:MyOrientation_Vert];
  2. rootLayout.frame = self.view.bounds;
  3. rootLayout.topPos.equalTo(@0);
  4. rootLayout.leftPos.equalTo(@0);
  5. rootLayout.rightPos.equalTo(@0);
  6. rootLayout.bottomPos.equalTo(@0);
  7. // 添加子视图
  8. UIView *view1 = [UIView new];
  9. view1.myHeight = 50;
  10. view1.leftPos.equalTo(@10);
  11. view1.rightPos.equalTo(@10);
  12. [view1 setBackgroundColor:[UIColor redColor]];
  13. [rootLayout addSubview:view1];
  14. UIView *view2 = [UIView new];
  15. view2.myHeight = 100;
  16. view2.leftPos.equalTo(@10);
  17. view2.rightPos.equalTo(@10);
  18. [view2 setBackgroundColor:[UIColor blueColor]];
  19. [rootLayout addSubview:view2];
  20. [self.view addSubview:rootLayout];
复制代码
在这个例子中,我们创建了一个垂直线性布局容器 rootLayout,并在其中添加了两个 UIView 子视图。每个子视图都有本身的高度和边距设置。view1 和 view2 分别设置了不同的高度,且左右边距为 10。
2. 相对布局(MyRelativeLayout)

相对布局允许子视图通过相对父视图或者其他子视图的位置来布局。
相对布局示例:
  1. MyRelativeLayout *rootLayout = [MyRelativeLayout new];
  2. rootLayout.frame = self.view.bounds;
  3. rootLayout.topPos.equalTo(@0);
  4. rootLayout.leftPos.equalTo(@0);
  5. rootLayout.rightPos.equalTo(@0);
  6. rootLayout.bottomPos.equalTo(@0);
  7. UIView *view1 = [UIView new];
  8. view1.mySize = CGSizeMake(100, 100);
  9. view1.centerXPos.equalTo(rootLayout.centerXPos);  // 水平居中
  10. view1.topPos.equalTo(@10);                        // 距离父视图顶部 10
  11. [view1 setBackgroundColor:[UIColor redColor]];
  12. [rootLayout addSubview:view1];
  13. UIView *view2 = [UIView new];
  14. view2.mySize = CGSizeMake(100, 100);
  15. view2.topPos.equalTo(view1.bottomPos).offset(10); // 位于 view1 底部,间隔 10
  16. view2.centerXPos.equalTo(view1.centerXPos);       // 水平与 view1 对齐
  17. [view2 setBackgroundColor:[UIColor blueColor]];
  18. [rootLayout addSubview:view2];
  19. [self.view addSubview:rootLayout];
复制代码
在这个示例中,view1 在父视图中程度居中,而且距离顶部有 10 的间隔。而 view2 则位于 view1 的下方,并保持程度对齐。通过设置 centerXPos 和 topPos 等属性,MyLayout 可以轻松实现相对布局。
3. 布局框架的类架构

这张图展示了 MyLayout 布局框架的类架构,资助开辟者理解其内部设计和结构。

通过这个类架构图,可以看到 MyLayout 框架是如何通过继承和扩展的方式,将多种布局模式整合到一个框架中,从而简化复杂布局的实现。
4. 底层原理

MyLayout 的底层原理主要是通过对每个视图的布局属性(如 myLeftMargin、myWidth、myHeight 等)进行计算,并在布局容器中根据这些属性重新调整每个子视图的位置和巨细。这个过程与 Auto Layout 体系相似,但 MyLayout 不依靠 iOS 自带的 Auto Layout 约束机制,而是通过手动布局来优化性能和简化实现。
1. 视图树遍历与布局计算

MyLayout 的核心机制是遍历视图树,逐个计算每个视图的位置和巨细。这个过程在布局视图的 layoutSubviews 方法中触发。当父布局容器需要重新布局时,会调用 layoutSubviews,在这个方法中,MyLayout 遍历所有子视图,并根据子视图的布局属性(如边距、宽高、自适应等)进行计算和定位。
每个视图的布局属性都会影响到其终极的 frame,MyLayout 会根据这些属性和布局容器的尺寸来动态调整子视图的位置和巨细。例如:
2. 布局属性的自定义与扩展

MyLayout 基于 UIView 的扩展,将自定义的布局属性直接挂载在每个子视图上。通过为 UIView 扩展自定义属性(例如 myLeftMargin、myHeight),MyLayout 实现了布局属性的可访问性。然后,框架通过在布局视图的 layoutSubviews 方法中访问这些自定义属性,完成布局的计算和调整。
这些自定义属性的设定值可以是固定数值,也可以是相对父视图或兄弟视图的动态值,这使得 MyLayout 在布局时非常机动。例如:
3. 自适应与动态调整

MyLayout 支持子视图的自适应布局,通过计算视图的固有内容巨细和父视图的剩余空间,动态调整子视图的尺寸和位置。与 Auto Layout 类似,当某个视图的内容发生厘革时(例如文本视图内容变长),MyLayout 可以自动调整该视图的巨细,使其适应新的内容。
此外,MyLayout 还支持动态调整布局。当父视图的尺寸改变时(例如旋转屏幕或窗口巨细调整),MyLayout 会重新计算所有子视图的布局,确保它们始终适应当前的父视图巨细。
4. 制止 Auto Layout 的性能开销

MyLayout 的一个主要优势是制止了 Auto Layout 体系带来的性能开销。Auto Layout 通过约束体系来管理布局,内部需要解决一系列的线性方程,这可能在复杂布局场景下导致性能瓶颈。而 MyLayout 直接操作视图的 frame 属性,跳过了约束的解析过程,从而提高了布局效率,特别是在需要频仍动态调整布局的场景中表现更佳。
5. 布局类型的实现

MyLayout 提供了多种布局类型(线性布局、相对布局、表格布局等),这些布局类型的实现原理是根据布局容器的不同类型,采用不同的算法来计算子视图的分列方式。例如:
6. 性能优化

MyLayout 的性能优化体现在以下几个方面:
4. 使用

podfile中加入,然后运行,下令:pod install
  1. source 'https://github.com/CocoaPods/Specs.git'
  2. platform :ios, '7.0'
  3. pod 'MyLayout'
复制代码
框架作者还给出了一个y演示demo:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4