[英]UIRefreshControl - How do I make the refresh action occur after the touch is released?
長時間監聽,第一次調用堆棧溢出。 要溫柔。
我在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];
}
如何延遲刷新:功能,直到用戶從拉動中移開手指?
我也遇到了同樣的問題。 我認為我的方法不是很好,但看起來很有效。
Init 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
已經在“正確”時間開始提供住宿。 pull-to-refresh控件的正確行為是在用戶超過“足夠遠”閾值后開始刷新,而不是在用戶釋放拖動時。
為了實現這一點,您需要修改-refresh:
方法以檢查控件何時轉換為refreshing
狀態:
-(void)refresh:(id)sender {
UIRefreshControl *refreshControl = (UIRefreshControl *)sender;
if(refreshControl.refreshing) {
(... refresh code ...)
}
}
請注意,您為(... refresh code ...)
調用的任何方法都應該是異步的,這樣您的UI就不會凍結。 您應該更改為主隊列並在(... refresh code ...)
塊的末尾調用-endRefreshing
,而不是在-refresh:
的結尾處-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
事件。
可以通過使用NSRunLoop
來實現僅在手指抬起時調度刷新。 調用-(void)performInModes:(NSArray<NSRunLoopMode> *)modes block:(void (^)(void))block;
在陣列中使用NSRunLoopDefaultMode
。
當觸摸仍然保持時,runloop模式是UITrackingRunLoopMode
,它將僅在升空后返回到默認值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.