UIRefreshControl色调与给定颜色不匹配

时间:2015-09-23 16:10:27

标签: ios uitableview cocoa-touch ios9 uirefreshcontrol

刷新颜色与色调颜色不一致并且看起来不同,我试图更改tintAdjustmentMode但结果是相同的

请注意,微调器和文本颜色应为0x2C76BE

tvc.refreshControl = [UIRefreshControl new];
tvc.refreshControl.tintAdjustmentMode = UIViewTintAdjustmentModeNormal;
tvc.refreshControl.tintColor = [UIColor colorWithHex:0x2C76BE];
tvc.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:@"Pull to query spectrum again" attributes:@{NSForegroundColorAttributeName:[UIColor colorWithHex:0x2C76BE]}];

enter image description here

2 个答案:

答案 0 :(得分:1)

当视图加载时,UIRefreshControl没有正确显示颜色,我也遇到了类似的问题,我调用beginRefreshing()。如果用户拉动刷新,则控件会正确显示我指定的tintColor。

首先,将刷新控件子类化。然后,重写子类中的didMoveToWindow方法。以下代码查找用于创建微调器的动画元素并设置其背景颜色。

此代码使用UIView的扩展来返回视图的所有子视图(我使用了Swift: Recursively cycle through all subviews to find a specific class and append to an array的Jon Willis的回答)。

class CustomRefreshControl: UIRefreshControl {

    override func didMoveToWindow() {
        super.didMoveToWindow()
        if let l = getNestedSubviews().first(where: { $0.layer is CAReplicatorLayer }), l.subviews.count > 0 {
            l.subviews[0].backgroundColor = UIColor.orange //getNestedSubviews method is an extension of UIView as referenced above
        }
}

微调器具有一个CAReplicatorLayer,其视图包含一个子视图。该子视图只是一个矩形,用于实现微调框的图形元素。这就是您要着色的图形元素。

答案 1 :(得分:0)

UIRefreshControl是一个错误的类。我注意到将tvc.refreshControl.tintColor = [UIColor colorWithHex:0x2C76BE];置于动画块内(即使是零持续时间)也会产生预期的结果。所以我测试了这个可怕的'hack':dispatch_async(mainQueue, <#set tintColor#>);并且也给出了正确的结果。刷新控制也可能依赖于调用-beginRefreshing-endRefreshing的时间。

因为UIRefreshControl的错误以及只能在UITableViewController中使用的限制让我非常恼火,所以我创建了一个完全可自定义的,可以与任何类型的UIScrollView(UICollectionView,UITableView)一起使用。请注意,我在UICollectionViewFlowLayout支持像tableView这样的粘性标头之前创建了这个,所以当启用该选项时,我的refreshcontrol不能正常工作。随意提交修复;)。

你可以在https://github.com/Joride/JRTRefreshControl找到它(如果这属于'无耻的插入条款',我将删除此链接,但我认为这与该问题相关。