经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 移动开发 » Swift » 查看文章
【Swift/Objective-c】公司项目优化(二) - 下拉刷新抖动问题
来源:cnblogs  作者:Mr丶Landen  时间:2021/1/25 11:14:55  对本文有异议

  使用MJRefresh进行列表下拉刷新时,会出现列表上下颤抖问题

  抖动的原因

  我们先来看看在手松开之后我们对scrollView做了什么事情:

  ScrollViewDidEndDragging => setContentInset:

  为了保证在“Loading”的状态下,下拉刷新控件可以展示,我们对contentInset做了修改,增加了inset的top. 那这样一步操作为什么会导致scrollView抖动一下呢。

  我在scrollViewDidScroll:中打了个断点,来看看在setContentInset:之后发生了什么事情。 我设置的inset.top = 64; 结果发现scrollView的contentOffset发生了这样的变化:(0, -64) =>  (0, -133) => (0, -64)

  由以上数据可以看出,contentOffset在这个过程中先被向下移动了一段,再回归正常。 猜测问题原因:

  1. 下拉松开之后, scrollView本身的 bounce 效果 当前设置inset冲突了

  由于我设置的

  1. mTableView.contentInset = UIEdgeInsets(top: kTopNavigationSafeMargin, left: 0, bottom: kTabBarHeight, right: 0)

  设置了之后就出现这个问题。如果不设置这句话就没有这个问题,但是跟他们UI给的效果图就不一样了。

  • 看了一下MJRefresh的源码:
    1. MJRefreshDispatchAsyncOnMainQueue({
    2. [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
    3. if (self.scrollView.panGestureRecognizer.state != UIGestureRecognizerStateCancelled) {
    4. CGFloat top = self.scrollViewOriginalInset.top + self.mj_h;
    5. // 增加滚动区域top
    6. self.scrollView.mj_insetT = top;
    7. // 设置滚动位置
    8. CGPoint offset = self.scrollView.contentOffset;
    9. offset.y = -top;
    10. [self.scrollView setContentOffset:offset animated:NO];
    11. }
    12. } completion:^(BOOL finished) {
    13. [self executeRefreshingCallback];
    14. }];
    15. })

    于是我尝试修改代码,改成如下:

    1. dispatch_async(dispatch_get_main_queue(), ^{
    2. [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
    3. CGFloat top = self.scrollViewOriginalInset.top + self.mj_h;
    4. // 增加滚动区域top
    5. self.scrollView.mj_insetT = top;
    6. // 判断了一下 这里面
    7. if ([self.scrollView isKindOfClass:[UICollectionView class]]) {
    8. self.scrollView.mj_offsetY = - top;
    9. }else {
    10. [self.scrollView setContentOffset:CGPointMake(0, -top) animated:NO];
    11. }
    12. } completion:^(BOOL finished) {
    13. [self executeRefreshingCallback];
    14. }];
    15. });

    2、给mTableVeiw的cell一个预估高度estimatedRowHeight;

    解决了。

       其他大神解决方法:

  1. dispatch_async(dispatch_get_main_queue(), ^{
  2. [UIView animateWithDuration:kAnimationDuration animations:^{
  3. self.scrollView.contentInset = inset;
  4. [self.scrollView setContentOffset:CGPointMake(0, -inset.top) animated:NO];
  5. } completion:^(BOOL finished) {
  6. }];
  7. });

 

原文链接:http://www.cnblogs.com/xjf125/p/14312845.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号