iOS 7 UIRefreshControl tintColor不适用于开始刷新
我想在我的UIRefreshControl(build立在iOS 7上)设置一个tintColor。 我启用了故事板中的tableViewController刷新,然后在我的ViewController viewDidLoad
方法我做了以下几点:
[self.refreshControl setTintColor:[UIColor redColor]];
所以现在,当我刷新刷新时,刷新控件的颜色确实是红色的:
我希望我的视图在出现时自动更新,所以我做了:
- (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开发,遇到了同样的问题。
我通过设置RefreshControl
的AttributedTitle
来解决着色问题:
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]; }];