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上遇到这个问题.
通常你使用 UIRefreshControl 来触发异步重新加载操作,并且应该在经过一定时间后调用 endAnimating。这里看起来就像刷新控件开始动画的那一刻,您就立即结束它。这可能会让 UIRefreshControl 感到困惑。
尝试在一段时间过后或在另一个runloop循环中调用endAnimating(例如在dispatch_async中调用它)。您的代码似乎还存在其他问题(例如,您的 tableView:cellForRowAtIndexPath: 错误地创建了单元格),因此可能还潜伏着其他问题。
归档时间: |
|
查看次数: |
4142 次 |
最近记录: |