UIRefreshControl - 如何在触摸释放后进行刷新操作?
长时间监听器,第一次调用此处堆栈溢出。要温柔。UIRefreshControl - 如何在触摸释放后进行刷新操作?
我在UITableView上实现UIRefreshControl来刷新表的数据。在其他拉到刷新实现中,刷新过程直到用户的手指在拉动刷新距离时被抬起才开始。 UIRefreshControl看起来并不像它具有这种定制。
我UIRefreshControl初始化代码:
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init];
[refreshControl addTarget:self action:@selector(refresh:) forControlEvents:UIControlEventValueChanged];
[self.tableView addSubview:refreshControl];
我刷新:代码非常简单:
-(void)refresh:(id)sender {
(... refresh code ...)
[sender endRefreshing];
}
我怎样才能延缓刷新:函数,直到用户从下拉消除他们的手指?
我也遇到了同样的问题。我不认为我的方法很好,但看起来像是有效的。
-
初始化
UIRefreshControl
UIRefreshControl *refreshControl = [[UIRefreshControl alloc] init]; self.refreshControl = refreshControl;
-
检查状态的
UIRefreshControl
当用户完成拖动表格(UITableViewDelegate
符合UIScrollViewDelegate
)- (void)scrollViewDidEndDecelerating:(UIScrollView*)scrollView { if(self.refreshControl.isRefreshing) [self refresh]; }
-
更新表
- (void)refresh { [self.refreshControl endRefreshing]; // TODO: Update here your items [self.tableView reloadData]; }
希望它能帮助你。
UIRefreshControl
已经在“正确”时间开始住宿。拉到刷新控制的正确行为是在用户跨越某个“足够远”的阈值后开始刷新,而不是在用户释放其拖动时。
为了做到这一点,你需要修改-refresh:
方法来检查当控制已经转变为refreshing
状态:
-(void)refresh:(id)sender {
UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
if(refreshControl.refreshing) {
(... refresh code ...)
}
}
请注意,你叫你的(... refresh code ...)
任何方法应该是异步的,以便您的用户界面不会冻结。你应该改变主队列,并在您的(... refresh code ...)
块的末尾调用-endRefreshing
,而不是在-refresh:
年底:
- (void)refresh:(id)sender {
__weak UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
if(refreshControl.refreshing) {
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
/* (... refresh code ...) */
dispatch_sync(dispatch_get_main_queue(), ^{
[refreshControl endRefreshing];
//reload the table here, too
});
});
}
}
控制事件更改为UIControlEventTouchUpInside
不会起作用,因为UIRefreshControl
不是UI打算直接与之互动的组件。用户将永远不会触摸UIRefreshControl
,所以没有UIControlEventTouchUpInside
事件可以触发。
这实际上是正确答案! – 2013-10-21 16:23:10
它不起作用。刷新方法只需调用一次,然后用户抬起手指(用ios 10.2测试) – user1105951 2017-01-12 18:46:51
如果用户缓慢进行拖放操作,此解决方案将起作用。如果它几乎像一个轻弹,加载轮将运行,但刷新:函数将不会被调用,直到表再次移动。 编辑:我改变了功能scrollViewDidEndDecelerating:它现在似乎工作正常。谢谢! – outphase 2013-03-24 00:21:27
是的,你很对!现在它效果更好,谢谢你纠正我的代码!) – Ned 2013-03-24 18:16:44
这是一个小问题。如果拉下桌面视图到足够刷新的位置,请保持手指放下,然后回到微调器大约一半可见的位置,然后放开......这将显示微调器旋转并且不会发生任何事情。 – 2014-06-16 18:05:52