美文网首页
iOS - 骨架屏集成问答文档和使用注意点

iOS - 骨架屏集成问答文档和使用注意点

作者: tigerAndBull | 来源:发表于2019-08-04 06:10 被阅读0次

前言

鉴于大家在集成TABAnimated的过程中,可能会遇到一些问题。
有一些问题是对TABAnimated不够了解造成,
有一些问题则是TABAnimated自身的原因。

作者建议,如果你遇到了达不到预期的集成效果,
先查找本文是否记录了这些信息,
如果在多次求证后,仍无法解决,反馈给我即可。

目录

  1. 是否能够应对淘宝这样复杂的界面?界面复杂后就容易出问题?
  2. 按照文档集成了之后,怎么没有效果?
  3. 框架的api和文档不一致?部分方法消失了?
  4. UITableView/UICollectionView预处理回调机制,包括tableHeaderView用法
  5. 骨架动画没有充满/铺满屏幕?
  6. 动画元素有压缩,甚至出现扁平状?
  7. 区头区尾没有效果?
  8. 如何理解TABAnimated是以section为单位的,如何应对以row为单位的UITableView/UICollectionView?

1. 是否能够应对淘宝这样复杂的界面?界面复杂后就容易出问题?

首先,对于淘宝界面,其复杂度和大部分主流app没有区别,TABAnimated完全可以应付的,必须强调的是,如何集成取决于你是如何实现的。
其次,界面复杂后就容易出问题这个来自简书下方的评论,我追问什么问题,后续没有回复我。

作者自身实践了很多,目前给出一下参考:

  1. 集成忌讳:为了省事,直接使用UIViewControllerself.view作为控制视图。如果你的布局比较规范,且你对于TABAnimated的理解很到位,那么你可以这么用。新手建议避开。

  2. 如果你使用的UITableView,你需要先搞清楚你自己的布局关系。
    UITableView的tableHeaderView和区头在TABAnimated中使用方式,以及预处理回调用法都有所区别。
    (详情见目录中第四个问题或者gihub上的demo)

  3. 我印象深刻的一件事:我集成了一位某开发者xxx写的很烂的组件,且视图有一大堆用不到的组件,wtf,那你add进去干嘛?布局感觉用的不是很规范(没有细看),挺坑的。
    我在没有阅读他布局代码的情况下,开启了角标检测,一堆动画元素和角标也都重叠在一起了,当时“盲调”了10几分钟,挺难受的。
    最后也算是改好了,效果还算可以。
    目前基于预处理回调还是完全可以解决的,确实耗时了一点,这也算是一个优化点。

2. 按照文档集成了之后,怎么完全没有效果?

  1. 检查AppDelegate中是否进行了初始化操作

  2. 检查使用版本号是否为最新稳定版本,以及podfile语法
    podfile语法强调: 'TABAnimated','~> 1.0.0'
    这个意思是pod下来的是 >= 1.0.0的版本,
    如果最新是1.0.8,且1.0.0是稳定版本,也会pod下来1.0.8

  3. 检查使用流程是否有误,自身代码是否有误

  4. 如果你是动态section,请必须指定animatedSectionCount

何为动态section?

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return self.dataArray.count;
}

看了代码后意思就很明显了,你的section数量,取决于请求下来的数据。

  1. 首先,openLog置为YES,然后右下角搜索以下内容:
注意:你采用了`self.delegate = self`,将delegate方法封装在了子类。那么,delegate方法的IMP地址为类对象所有,所以由该类创建的UITableView的代理方法的IMP地址始终唯一,本库不支持这种做法。

如果你搜索到了,说明你封装了UITableView/UICollectionView的子类,且在子类中使用了self.delegate = self,将一些逻辑封装在类的代理方法内部。

如果未搜索到,看下一条。

目前框架不支持该行为,原因如下(嫌长可以跳过):

OC中类也是对象,由你封装的UITableView/UICollectionView子类初始化产生的对象,该对象(在类内封装好)的代理方法的IMP指针,统统指向类,即他们的IMP地址是一致的。

而TABAnimated采用的是AOP,且逻辑为每次setDelegate/DataSource时,动态地将管理动画的代码,切入到你IMP地址中,如果多次切换的是同一个地址,那么代码逻辑就乱了。

如果你项目中只是部分用到,你不用担心会产生混乱,TABAnimated识别并禁用了这种情况。

  1. 使用了xib/storyBoard创建的UITableView
    这种情况目前无法使用动画库,
    原因如下:
    使用该方式创建的UITableView不走setDelegate方法。

  2. 如果以上情况均没有,请反馈给我,谢谢

3. 框架的api和文档不一致?部分方法消失了?

  1. 确保你使用最新稳定版本,并检查podfile语法
  2. 1.8.7,2.1.3 ,2.1.7,2.1.8
    以上均有api变动,其中1.8.7和2.1.7是废弃版本

4. UITableView/UICollectionView预处理回调机制

  1. 如何区分哪个cell?包括区头区尾,全部在这一个回调处理。
    (UICollectionView同理)
self.tableView.tabAnimated.adjustWithClassBlock = ^(TABComponentManager * _Nonnull manager, Class  _Nonnull __unsafe_unretained targetClass) {
  
      if (targetClass == IconTableViewCell.class) {
            manager.animation(0).up(5);
            manager.animation(1).down(5);
      }
 
      if (targetClass == CourseTableViewCell.class) {
            // 链式语法处理
      }

});

  1. tableHeaderView需要另写一个回调,且为下面这种写法,
    showTableHeaderView属性需要设置为YES
_tableView.tabAnimated.showTableHeaderView = YES;
_tableView.tableHeaderView.tabAnimated.adjustBlock = ^(TABComponentManager * _Nonnull manager) {
};

5. 骨架动画没有充满/铺满屏幕?

不能铺满屏幕是因为自动计算设置的数量有问题,手动进行控制即可。

关于动画数量,包含以下3种:

  1. animatedCount是为了单个section/单个cell设计的,
  2. animatedSectionCount是为了动态section这个需求设计的
  3. 多section多cell,必须要指定count,
    因为这种视图大多比较复杂,比较长,数量控制少量就好了

6. 动画元素有压缩,甚至出现扁平状?

动画有一个全局属性animatedHeightCoefficient

属性含义:动画高度与视图原有高度比例系数,该属性对除了UIImageView类型的所有view都生效

  • 在实践中发现,对于UILabel,UIButton等视图,当动画的高度与原视图的高度一致时,效果并不美观(太粗)。
  • 大概保持在0.75的比例,动画效果比较美观,所以默认值是0.75。

圆角问题:如果原视图有圆角,但是此时高度压缩了,圆角没有变,
所以可能会变形。

7. 区头区尾没有效果?

区头区尾均有2个api接口

  1. 正常情况下,必须指定section,否则无效
[_collectionView.tabAnimated addHeaderViewClass:[TestHeadView class]
                                       viewSize:CGSizeMake(kScreenWidth, 100)
                                      toSection:0];
  1. 动态section的情况
[_collectionView.tabAnimated addHeaderViewClass:[TestHeadView class]
                                       viewSize:CGSizeMake(kScreenWidth, 100)];

8. 如何理解TABAnimated是以section为单位的,如何应对以row为单位的UITableView/UICollectionView?

TABAnimated是以section为单位的,解释如下:

  1. 在默认情况下,section数量就是你项目中的section数量。

  2. 当你项目中是动态section,这个时候,animatedSectionCount出现了。
    设置该属性后,你在动画时的section数量就是animatedSectionCount的数量。

如果我的section数量使用的是默认值1,且通过row来控制多cell,怎么办?

效果阐述:如果该情况下常规使用TABAnimated,效果上永远都只有第一个cell的动画样式。

解决方案:

  1. 需要实现numberOfSectionsInTableView, 并返回你想要的数量1。
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}
  1. 设置animatedSectionCount为你自己的项目中的row的数量

二者缺一不可,如果不是必要的,不建议这样做,建议以section为单位用UITableView/UICollectionView。

相关文章

网友评论

      本文标题:iOS - 骨架屏集成问答文档和使用注意点

      本文链接:https://www.haomeiwen.com/subject/lmkedctx.html