设置 UIRefreshControl 的 UIActivityIndi​​catorView 的颜色?

Posted

技术标签:

【中文标题】设置 UIRefreshControl 的 UIActivityIndi​​catorView 的颜色?【英文标题】:Set Color of UIActivityIndicatorView of a UIRefreshControl? 【发布时间】:2013-05-11 21:13:33 【问题描述】:

有没有办法设置UIRefreshControl的活动指示器(可能是UIActivityIndicatorView)的颜色?

我能够设置“橡胶”和指示器的颜色:

[_refreshControl setTintColor:[UIColor colorWithRed:0.0f/255.0f green:55.0f/255.0f blue:152.0f/255.0f alpha:1.0]];

但我想要“橡胶”为蓝色,活动指示器为白色,这可能吗?

【问题讨论】:

【参考方案1】:

这不是官方支持的,但如果你想冒险未来的 ios 更改会破坏你的代码,你可以试试这个:

根据 ayoy 的回答,我构建了 UIRefreshControl 的子类,它在beginRefresing 中设置 ActivityIndi​​cator 的颜色。这应该是一个更好的放置位置,因为您可以在代码中调用它,而不是由用户导致动画开始。

@implementation WhiteRefreshControl : UIRefreshControl

- (void)beginRefreshing

    [super beginRefreshing];

    NSArray *subviews = [[[self subviews] lastObject] subviews];
    //Range check on subviews
    if (subviews.count > 1) 
    
        id spinner = [subviews objectAtIndex:1];
        //Class check on activity indicator
        if ([spinner isKindOfClass:[UIActivityIndicatorView class]]) 
        
            UIActivityIndicatorView *spinnerActivity = (UIActivityIndicatorView*)spinner;
            spinnerActivity.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;
        
    

【讨论】:

谢谢,这正是我需要的。非常好,可重复使用:) 也感谢 ayoy 最初的想法:) 你不应该在最后还是在某个时候打电话给[super beginRefreshing]; 这依赖于保持不变的UIRefreshControl 的层次结构——Apple 不保证这一点。【参考方案2】:

嗯,从技术上讲,您可以做到,但不受支持。您最好听从 Dave 的建议,如果您坚持,请继续阅读。

如果您调查 UIRefreshControl 的子视图,结果会发现它包含一个子视图,属于 _UIRefreshControlDefaultContentView 类。

如果您随后检查处于刷新状态的内容视图的子视图,它包含以下内容:

UILabel UIActivityIndicatorView UIImageView UIImageView

所以技术上在您对UIControlEventValueChanged 事件的回调中,您可以执行以下操作:

UIActivityIndicatorView *spinner = [[[[self.refreshControl subviews] lastObject] subviews] objectAtIndex:1];
spinner.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite;

这会奏效。它也不违反应用审查指南,因为它不使用私有 API(浏览视图的子视图并使用公共 API 使用它们是合法的)。 但请记住,UIRefreshControl 的内部实现可以随时更改,您的代码可能无法在更高版本的 iOS 中运行甚至崩溃。

【讨论】:

嗯,有意思,我复制了你的代码,不行。。。里面好像没有UIActivityIndi​​cator,但是:for (id v in [[[_refreshControl subviews] lastObject] subviews] ) NSLog(@"%@", [v class]);给我:UILabel、UIImageView、UIImageView 正如我在答案中所说,您必须在 UIControlEventValueChanged 的​​回调中调用它。然后它获取 UIActivityIndi​​catorView。 我正在使用相同的方法,但只是认为值得一提的是,您应该使用一些检查(范围和类),以防苹果决定更改 UIRefreshControl 未来的组织方式。 【参考方案3】:

不,这是不可能的。您需要提交 an enhancement request 要求 Apple 执行此操作。

【讨论】:

感谢 Dave,我已向 Apple 提出增强请求!编号:13870593

以上是关于设置 UIRefreshControl 的 UIActivityIndi​​catorView 的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

UIRefreshControl 属性标题多行

UIRefreshControl 不清除表格视图

通过 UIA 脚本访问 iOS 用户偏好以实现 UI 自动化

UIRefreshControl 问题

如何使 UIRefreshControl 更小?

如何重启 UIRefreshControl 动画?