iOS 7 UIRefreshControl tintColor不适用于开始刷新

我想在我的UIRefreshControl(build立在iOS 7上)设置一个tintColor。 我启用了故事板中的tableViewController刷新,然后在我的ViewController viewDidLoad方法我做了以下几点:

 [self.refreshControl setTintColor:[UIColor redColor]]; 

所以现在,当我刷新刷新时,刷新控件的颜色确实是红色的:

redSpiny

我希望我的视图在出现时自动更新,所以我做了:

 - (void)viewDidAppear:(BOOL)animated{ [self.refreshControl beginRefreshing]; } 

它没有显示纺车,根据https://stackoverflow.com/a/16250679/1809736 ,我补充说

 [self.tableView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:NO]; 

强制显示它。 它显示它,但现在它回到默认的颜色:

在这里输入图像说明

如果我尝试手动刷新以后,它是红色的。

我试图在iOS6上构build它,它应该如此,那么这是一个iOS7的错误?

PS:这不是模拟器的问题,我尝试在设备上构build它,同样的错误。

PPS:我build立了一个示例项目,你能告诉我,如果你有同样的错误,或者如果我的代码有问题? 这里是链接: http : //d.pr/f/pGrV

非常感谢 !

嘿,偶然发现了这个问题。

有趣的是我通过设置contentOffset然后调用beginRefreshing来修复我的代码

 if(self.tableView.contentOffset.y == 0){ self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height); [self.refreshControl beginRefreshing]; } 

您可能想要为此过程制作animation:

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

希望这可以帮助你。

w ^

SWIFT解决scheme! 在viewDidLoad插入以下代码:

 self.refreshControl.tintColor = UIColor.orangeColor() self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height) self.refreshControl.beginRefreshing() 

Swift 3.1

 self.refreshControl.tintColor = UIColor.orange self.tableView.contentOffset = CGPoint(x:0, y:-self.refreshControl.frame.size.height) self.refreshControl.beginRefreshing() 

@ william-george的回答让我朝着正确的方向发展,但却让我感到奇怪的自动布局animation问题。

所以这里是适合我的版本:

 - (void)programaticallyRefresh { // Hack necessary to keep UIRefreshControl's tintColor [self.scrollView setContentOffset:CGPointMake(0, -1.0f) animated:NO]; [self.scrollView setContentOffset:CGPointMake(0, -self.refreshControl.frame.size.height) animated:YES]; [self.refreshControl beginRefreshing]; [self refresh]; } 

-refresh是绑定到UIRefreshControl的方法。

这些答案都没有正确的在iOS8上工作,最接近@ jpsim的答案,但仍然留下一个难看的黑色刷新控制在其淡入淡出animation(它会交叉淡入黑色之间,而在整个animation过程中)。

我的解决scheme是在我的viewDidLoad中创build刷新控制后立即把它放在这里:

 self.refreshControl = [[UIRefreshControl alloc] init]; self.refreshControl.tintColor = [UIColor whiteColor]; ... self.refreshControlHeight = self.refreshControl.frame.size.height; [self.tableView setContentOffset:CGPointMake(0, -1) animated:NO]; [self.tableView setContentOffset:CGPointMake(0, 0) animated:NO]; 

然后以编程方式显示UIRefreshControl:

 [self.tableView setContentOffset:CGPointMake(0, self.tableView.contentOffset.y-self.refreshControlHeight) animated:YES]; [self.refreshControl beginRefreshing]; 

我不得不存储刷新控件的高度,因为它是为第一次调用设置的,随后的调用将具有0的高度。

迅速:

我正在使用Swift和> iOS8。 大部分描述的解决方法并不适用于我。 这就是我的工作原理:

在viewDidLoad中:

 customRefreshControl.tintColor = UIColor.clearColor() 

以下内容不一定要在viewDidLoad里面。 我把它放在一个额外的函数中,每次我更新tableView时都会调用它:

 private func startRefreshControlAnimation() { self.tableView.setContentOffset(CGPointMake(0, -self.customRefreshControl.frame.size.height), animated: true) CATransaction.begin() self.customRefreshControl.beginRefreshing() CATransaction.commit() } 

tintColor问题的解决scheme:将其添加到viewDidLoad中

 [self.refreshControl setTintColor:[UIColor whiteColor]]; [self.refreshControl tintColorDidChange]; 

当您手动调用beginRefresh时,现在有一个白色指示器。

我结合了一些以前的答案。 这适用于iOS 9和Swift 2:

 override func viewDidAppear(animated: Bool) { super.viewDidAppear(animated) let contentOffset = self.tableView.contentOffset.y UIView.animateWithDuration(0, delay: 0, options: .BeginFromCurrentState, animations: { print(self.tableView.contentOffset.y) self.tableView.setContentOffset(CGPointMake(0, -self.refreshControl.frame.size.height), animated: false) }, completion: { finished in self.refreshControl.beginRefreshing() self.tableView.setContentOffset(CGPointMake(0, contentOffset/2-self.refreshControl.frame.size.height), animated: true) self.refresh() // Code that refresh table data }) } 

我使用Xamarin(C#)为iOS开发,遇到了同样的问题。

我通过设置RefreshControlAttributedTitle来解决着色问题:

 private CGPoint originalOffset; ... public override void ViewDidLoad () { base.ViewDidLoad (); ... originalOffset = TableView.ContentOffset; // Store the original offset of the table view RefreshControl = new UIRefreshControl (){ TintColor = UIColor.Red }; RefreshControl.ValueChanged += ((s,e) => { Update (this, EventArgs.Empty); }); // Hack so the TintColor of the RefreshControl will be properly set RefreshControl.AttributedTitle = new NSAttributedString ("Fetching data"); } 

我的更新方法如下所示:

 private async void Update(object sender, EventArgs args) { try { TableView.UserInteractionEnabled = false; // I find -100 to be a big enough offset TableView.SetContentOffset (new CGPoint (0, -100), true); RefreshControl.BeginRefreshing (); ... // Fetch data & update table source TableView.ReloadData (); } catch(Exception) { // Respond to exception } finally { // Put the offset back to the original TableView.SetContentOffset (originalOffset, true); RefreshControl.EndRefreshing (); TableView.UserInteractionEnabled = true; } } 

一旦ViewDidAppear ,我以编程方式调用Update 。 在设置属性标题之前,我的微调将会是黑色的。 现在它有适当的红色。

值得注意的是,这个“黑客/修复”还带有第二个错误。 第一次刷新时,您会注意到AttributedTitle没有显示。 刷新第二个(,第三,第四,…)时间将正确显示标题。 但是如果你不想要一个标题,你只需要用一个空string来初始化它,这对你来说不是一个大问题。

我希望这可以用于其他人。

为UIResfreshControl添加一个扩展。

 extension UIRefreshControl { func beginRefreshingManually() { self.tintColor = UIColor.white if let scrollView = superview as? UIScrollView { scrollView.setContentOffset(CGPoint(x: 0, y:scrollView.contentOffset.y - frame.height), animated: false) } beginRefreshing() } } 

尝试在viewWillAppear中设置UIRefreshControl的tintColor。

我发现一些工作,我希望它适合你

  [_TBL setContentOffset:CGPointMake(0,_TBL.contentOffset.y-_refreshControl.frame.size.height) animated:YES]; [_refreshControl performSelector:@selector(beginRefreshing) withObject:nil afterDelay:0.25]; [self getLatestUpdates]; 

我创build了一个修复此问题的下拉式UIRefreshControl + beginRefreshing类别 。

简而言之,它修复了tintColor问题并手动调整了contentOffset以确保刷新控件可见。 请尝试 :)

这个黑客非常有效

 var refreshWasProgramBeginning: Bool = false override func viewDidAppear(_ animated: Bool) { super.viewDidAppear(animated) if !refreshWasProgramBeginning { UIView.animate(withDuration: 0.25, animations: { self.tableView.contentOffset = CGPoint.init(x: 0, y: -self.refreshControl.frame.height) }) { (_) in self.refreshControl.beginRefreshing() self.refreshWasProgramBeginning = true } } } 

这个问题已经有相当多的答案,但没有专门针对iOS 11的答案。

尝试了几件事之后,我想出了以下解决scheme – 它与iOS 11中引入的新的大型导航栏风格完美结合:

 // This code is totally weird. Yet, since otherwise the tint is not shown properly, it's the only possible way. UIView.animate(withDuration: 0, animations: { self.tableView.setContentOffset(CGPoint(x: 0, y: -176), animated: false) }) { _ in self.tableView.setContentOffset(CGPoint(x: 0, y: -176), animated: true) self.refreshControl?.beginRefreshing() } 

我正在使用Xamarin C#(iOS 10),并发现所有这些答案的组合都是为我修复的。

在我的ViewDidLoad我有以下几点:

  RefreshControl = new UIRefreshControl(); RefreshControl.TintColor = UIColor.White; RefreshControl.ValueChanged += OnRefresh; RefreshControl.BackgroundColor = UIColor.Clear; 

后来我以编程方式在我的ViewDidAppear使用以下ViewDidAppear调用刷新animation:

  BeginInvokeOnMainThread(() => { UIView.Animate(0, 0.2, UIViewAnimationOptions.BeginFromCurrentState, () => { TableView.SetContentOffset(new CGPoint(0, TableView.ContentOffset.Y - RefreshControl.Frame.Size.Height), true); RefreshControl.AttributedTitle = new NSAttributedString(""); }, () => { RefreshControl.BeginRefreshing(); }); }); 

请注意归属标题和animation块的设置是我的RefreshControl使我的白色色彩缺失的部分。

感谢所有对这个问题的贡献。

强制setTintColor在主线程中运行。 (主线程更新ui)。

 [[NSOperationQueue mainQueue] addOperationWithBlock:^ { [self.refreshControl setTintColor:[UIColor redColor]]; [self.refreshControl beginRefreshing]; }];