zoukankan      html  css  js  c++  java
  • 【Swift/Objective-c】公司项目优化(二)

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

      抖动的原因

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

      ScrollViewDidEndDragging => setContentInset:

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

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

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

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

      由于我设置的

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

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

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

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

      dispatch_async(dispatch_get_main_queue(), ^{
                          [UIView animateWithDuration:MJRefreshFastAnimationDuration animations:^{
                              CGFloat top = self.scrollViewOriginalInset.top + self.mj_h;
                              // 增加滚动区域top
                              self.scrollView.mj_insetT = top;
                              // 判断了一下 这里面
                              if ([self.scrollView isKindOfClass:[UICollectionView class]]) {
                                  self.scrollView.mj_offsetY = - top;
                              }else {
                                  [self.scrollView setContentOffset:CGPointMake(0, -top) animated:NO];
                              }
                          } completion:^(BOOL finished) {
                              [self executeRefreshingCallback];
                          }];
                       });

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

      解决了。

           其他大神解决方法:

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

    分享链接:

    工作之余,开了一个淘宝小店,分别销售日常必备生活用品,期待您的光临!点击下图,跳转店铺首页!
  • 相关阅读:
    点击复制的代码
    色彩浅谈——同色系的变化
    网页设计中色彩的运用
    网页设计中透明效果的使用技巧
    基于栅格的网站设计
    页面之门——登录页的设计分析
    错误变惊喜,10个有趣的404页面设计(转)
    jQuery load()方法用法集锦!
    RPM命令用法
    如何使iframe透明
  • 原文地址:https://www.cnblogs.com/xjf125/p/14312845.html
Copyright © 2011-2022 走看看