iOS 7 UIRefreshControl tintColor无法用于beginRefreshing

Noé*_*ieu 74 iphone user-interface xcode objective-c ios7

我正在尝试在我的UIRefreshControl上设置tintColor(在iOS 7上构建).我在storyboard中为tableViewController启用了刷新,然后在我的ViewController viewDidLoad方法中,我执行了以下操作:

[self.refreshControl setTintColor:[UIColor redColor]];
Run Code Online (Sandbox Code Playgroud)

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

redSpiny

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

- (void)viewDidAppear:(BOOL)animated{
    [self.refreshControl beginRefreshing];
}
Run Code Online (Sandbox Code Playgroud)

根据/sf/answers/1137547561/,它没有显示纺车,我添加了

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

强迫表现出来.它显示了它,但现在又回到了默认颜色:

在此输入图像描述

如果我之后尝试手动拉动以刷新,则为红色.

我尝试在iOS6上构建它并且它可以正常工作,这是一个iOS7错误吗?

PS:这不是模拟器的问题,我尝试在设备上构建它,同样的bug.

PPS:我构建了一个示例项目,你能告诉我你是否有相同的bug或我的代码中是否有问题?这是链接:http://d.pr/f/pGrV

非常感谢 !

Wil*_*rge 53

嘿,他偶然发现了这个问题.

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

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

您可能想要为此过程设置动画:

[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];
}];
Run Code Online (Sandbox Code Playgroud)

希望这对你有所帮助.

w ^

  • 像宣传的那样工作.真奇怪.谢谢 :) (2认同)

Fox*_*150 24

SWIFT解决方案!在以下代码中插入以下代码viewDidLoad:

self.refreshControl.tintColor = UIColor.orangeColor()
self.tableView.contentOffset = CGPointMake(0, -self.refreshControl.frame.size.height)
self.refreshControl.beginRefreshing()
Run Code Online (Sandbox Code Playgroud)

Swift 3.1

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

  • 谢谢这为我解决了从`viewDidLoad`加载时的一些问题。每次第一次使用时,刷新控件的高度和颜色都不正确。 (2认同)

jps*_*sim 8

@ william-george的答案让我朝着正确的方向前进,但却给了我奇怪的自动布局动画问题.

所以这是适合我的版本:

- (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];
}
Run Code Online (Sandbox Code Playgroud)

-refresh是与之相关的方法UIRefreshControl.


小智 7

为 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()
    }
}
Run Code Online (Sandbox Code Playgroud)


Tre*_*ree -2

强制 setTintColor 在主线程中运行。(主线程更新用户界面)。

[[NSOperationQueue mainQueue] addOperationWithBlock:^ {
    [self.refreshControl setTintColor:[UIColor redColor]];
    [self.refreshControl beginRefreshing];
}];
Run Code Online (Sandbox Code Playgroud)