设置 UIRefreshControl 的 UIActivityIndicatorView 的颜色?
Posted
技术标签:
【中文标题】设置 UIRefreshControl 的 UIActivityIndicatorView 的颜色?【英文标题】: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
中设置 ActivityIndicator 的颜色。这应该是一个更好的放置位置,因为您可以在代码中调用它,而不是由用户导致动画开始。
@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 中运行甚至崩溃。
【讨论】:
嗯,有意思,我复制了你的代码,不行。。。里面好像没有UIActivityIndicator,但是:for (id v in [[[_refreshControl subviews] lastObject] subviews] ) NSLog(@"%@", [v class]);给我:UILabel、UIImageView、UIImageView 正如我在答案中所说,您必须在 UIControlEventValueChanged 的回调中调用它。然后它获取 UIActivityIndicatorView。 我正在使用相同的方法,但只是认为值得一提的是,您应该使用一些检查(范围和类),以防苹果决定更改UIRefreshControl
未来的组织方式。 【参考方案3】:
不,这是不可能的。您需要提交 an enhancement request 要求 Apple 执行此操作。
【讨论】:
感谢 Dave,我已向 Apple 提出增强请求!编号:13870593以上是关于设置 UIRefreshControl 的 UIActivityIndicatorView 的颜色?的主要内容,如果未能解决你的问题,请参考以下文章