UIRefreshcontrol在拉下并握住时会紧张不安

Anu*_*lik 11 objective-c ios uirefreshcontrol pull-to-refresh ios7

我在tableviewcontroller中创建了一个UIRefreshcontrol,如下所示在viewdidload方法中:

    refresh = [UIRefreshControl.alloc init];
    refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to Refresh"];
    [refresh addTarget:self action:@selector(refreshChatsTableView) forControlEvents:UIControlEventValueChanged];
    self.refreshControl = refresh;
Run Code Online (Sandbox Code Playgroud)

问题是,当我把它拉下来一段时间后,桌子会抖动,给人一种非常不愉快的UI体验.有人可以帮忙吗?仅在横向模式下才会遇到此问题.

这是我的代码:

-UIRefreshControl  *refresh;

    -(void)viewDidLoad{
        [super viewDidLoad];
         arr= [[NSArray    alloc]initWithObjects:@"A",@"B",@"C",@"D",@"E",@"A",@"B",@"C",@"D",@"E", nil];

        //refresh control
        refresh = [UIRefreshControl.alloc init];
        refresh.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to   Refresh"];
        [refresh addTarget:self action:@selector(refreshChatsTableView)  forControlEvents:UIControlEventValueChanged];
        self.refreshControl = refresh;
      }


    -(void)refreshChatsTableView{
        [refresh endRefreshing];
    }

    -(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
        return 1;
    }

    -(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
       return arr.count;
    }

    -(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
        static NSString *CellIdentifier = @"Cell";
        UITableViewCell *cell =[[UITableViewCell alloc]init];
        cell.textLabel.text = [arr objectAtIndex:indexPath.row ];

        return cell;
    }
Run Code Online (Sandbox Code Playgroud)

Dev*_*vin 22

所以我遇到了同样的问题,我想出了一个解决方案.基本上,如果你将tableView拉得足够远并保持它,ValueChanged控件事件将在用户释放触摸之前触发.如果您刷新数据并在此时重新加载tableView,表格将跳起来.

为了解决这个问题,我最终独立于ValueChanged事件刷新了表.相反,我使用该事件以及scrollView委托方法仅在用户放手后刷新表.

首先,在viewDidLoad中设置refreshControl.

override func viewDidLoad()
{
    super.viewDidLoad()

    refreshControl = UIRefreshControl()
    refreshControl?.addTarget(self, action: "refreshControlChanged", forControlEvents: UIControlEvents.ValueChanged)
}
Run Code Online (Sandbox Code Playgroud)

ValueChanged方法很简单.如果我们已经停止拖动,这在快速向下滑动后发生,只需使用您自己的自定义方法刷新表.

internal func refreshControlChanged()
{
    if !tableView.dragging
    {
        refresh()
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,您需要实现didEndDragging.如果你已经拉得足够远,那么refreshControl会刷新,所以调用刷新.否则,您要么没有拉得足够远,要么拖动表的另一部分,要么拖得太快以至于还没有触发refreshControl ValueChanged事件,它将刷新那里的表.

override func scrollViewDidEndDragging(scrollView: UIScrollView, willDecelerate decelerate: Bool)
{
    if refreshControl?.refreshing == true
    {
        refresh()
    }
}
Run Code Online (Sandbox Code Playgroud)

就是这样.在您停止拖动之前,表格不会重新加载,这可以避免您注意到的抖动跳跃.我知道这已经有一年了,但我希望这可以帮助其他人在Google上遇到这个问题.


Mic*_*aur 0

通常你使用 UIRefreshControl 来触发异步重新加载操作,并且应该在经过一定时间后调用 endAnimating。这里看起来就像刷新控件开始动画的那一刻,您就立即结束它。这可能会让 UIRefreshControl 感到困惑。

尝试在一段时间过后或在另一个runloop循环中调用endAnimating(例如在dispatch_async中调用它)。您的代码似乎还存在其他问题(例如,您的 tableView:cellForRowAtIndexPath: 错误地创建了单元格),因此可能还潜伏着其他问题。