手动调用 UIRefreshControl 并使用 setContentOffset

Posted

技术标签:

【中文标题】手动调用 UIRefreshControl 并使用 setContentOffset【英文标题】:Manually calling UIRefreshControl and using setContentOffset 【发布时间】:2018-02-14 10:41:44 【问题描述】:

我已经在 viewDidLoad() 中实现了如下所示的 refreshControl:

refreshControl = [[UIRefreshControl alloc] init];
if (@available(ios 10.0, *)) 
    self.tableView.refreshControl = refreshControl;
 else 
    [self.tableView addSubview:refreshControl];

现在我将展示另一个 viewController,它具有选择过滤器的选项。选择这些过滤器后,您将再次返回到具有 refreshControl 的当前 viewController。

我在 viewDidAppear() 中添加了以下代码,用于手动调用 beginRefreshing:

if (self.filterChanged) 
    self.filterChanged = NO;
    [self.activityTableView setContentOffset:CGPointMake(0, - refreshControl.frame.size.height) animated:YES];
    [refreshControl setHidden:NO];
    [refreshControl beginRefreshing];

我使用 setContentOffset 滚动回顶部并显示 refreshControl。 唯一的问题是假设我的 tableView 在两者之间滚动了一半,那么 refreshControl 之间有很大的差距。

如果我的 tableView 没有滚动,那么它可以正常工作,就像我拉下刷新一样,但如果它是半滚动的,那么尽管给出了 setContentOffset,但 refreshControl 和 tableview 之间还是有很大的差距。

【问题讨论】:

【参考方案1】:

您需要等待滚动完成才能开始刷新。不幸的是,setContentOffset 上没有完成块,所以试试这个。

创建刷新控件后,设置目标并创建相应的方法。

[_refreshControl addTarget:self action:@selector(refreshRequested) forControlEvents:UIControlEventValueChanged];

- (void)refreshRequested 
    [_activityTableView reloadData];

在您的viewDidAppear 中,您滚动到顶部并在完成时刷新。

[UIView animateWithDuration:0.25 delay:0 options:0 animations:^(void)        
    self.activityTableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height);
 completion:^(BOOL finished)
    [self.refreshControl beginRefreshing];
    [self refreshRequested];
];

完成加载后,您需要结束刷新并确保滚动回零位置。

- (void)finishedLoading 
    [_refreshControl endRefreshing];
    [self.activityTableView setContentOffset:CGPointMake(0, 0) animated:YES];

【讨论】:

"不幸的是,setContentOffset 上没有完成块" 实际上,是的。有一种方法可以检测滚动动画何时结束。 我明白你在说什么。为什么不在另一个答案中分享您的想法? 我认为这不是您的回答的主要问题。我只是建议“没有完成块”有点强。 :)

以上是关于手动调用 UIRefreshControl 并使用 setContentOffset的主要内容,如果未能解决你的问题,请参考以下文章

使用 UIRefreshControl 刷新 UITableView

以编程方式调用 UIRefreshControl 不起作用

如何以编程方式向下滑动UITableView以显示底层的UIRefreshControl

UIRefreshControl - 当UITableViewController在UINavigationController中时,beginRefreshing无效

没有 UITableViewController 的 UIRefreshControl 不调用选择器

根据当前 URL 使用 UIRefreshControl 刷新