iOS 7如何更改MPVolumeView路由按钮的颜色

8
我正在设计一个iOS 7的音乐应用程序,我想直接在我的应用程序中放置“AirPlay”路由选择器按钮。我已经成功地将按钮放置在了正确的位置,但它没有显示出来,因为图标是白色的,而我的背景也是白色的。
有没有办法改变路由按钮的颜色?
以下是我用来创建按钮的代码。
self.airPlayButton = [[MPVolumeView alloc] initWithFrame:CGRectZero];
    self.airPlayButton.showsVolumeSlider = NO;
    [self.airPlayButton sizeToFit];
    self.airPlayButton.backgroundColor = [UIColor myGreenColor];
    [self addSubview:self.airPlayButton];

基本上,我想要下面的图片,但是我希望图标是绿色的,而不仅仅是它的背景。

更改背景的MPVolumeView路由按钮

3个回答

11

在审查亚当的答案后,我希望任务更清晰明了。因此,我稍微保护了一下那段代码:

Objective-C:

for( UIView *wnd in volumeView.subviews ) {
    if( [wnd isKindOfClass:[UIButton class] ]) {
        UIButton *button = (UIButton*) wnd;
        UIImage *img = button.currentImage;
        UIImage *img2 = [img imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
        [volumeView setRouteButtonImage: img2 forState:UIControlStateNormal];
        break;
    }
}

快速:

    for view in volumeView.subviews {
        if view.isKindOfClass(UIButton) {
            let buttonOnVolumeView : UIButton = view as! UIButton
            volumeView.setRouteButtonImage(buttonOnVolumeView.currentImage?.imageWithRenderingMode(.AlwaysTemplate), forState: .Normal)
            break;
        }
    }

现在它会对volumeView的tintColor属性做出反应,如果苹果决定添加另一个按钮或更改序列,此代码仍将起作用。


1
这对我来说完美地解决了问题!在我看来是最佳方案!谢谢! - funkenstrahlen
有没有办法调整当Airplay按钮连接时的颜色?我已经按照您的建议更改了色调,但一旦连接,它仍然保持不变。 - tnaught

7

lanbo 的答案 上进行扩展,你也可以获取“路线按钮”的原始图像,并创建一个使用 UIImageRenderingMode.AlwaysTemplate 渲染模式的副本。这样它就会遵循当前的 tintColor

Swift 代码:

    let volumeView = MPVolumeView()

    if let routeButton = volumeView.subviews.last as? UIButton,
        let routeButtonTemplateImage  = routeButton.currentImage?.imageWithRenderingMode(.AlwaysTemplate)
    {
        volumeView.setRouteButtonImage(routeButtonTemplateImage, forState: .Normal)
    }

它能工作,但是确定最后一个视图是图片吗? - Karsten
没有任何保证,但是 if let 语句确保了如果它不是一个 UIButton,那么它是安全的。 - Adam Bolcsfoldi
为什么 volumeView.routeButtonImageForState(UIControlState.Normal)?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate); 不起作用? - Sjoerd Perfors

6

创建您自己的图像并尝试 setRouteButtonImage: forState: 为指定的控制状态分配按钮图像。

- (void)setRouteButtonImage:(UIImage *)image forState:(UIControlState)state

参数

image - 与指定状态相关联的图像。

state - 与图像相关联的控制状态。

讨论

使用此功能自定义路线按钮在启用、禁用、突出显示等情况下的外观。

iOS 6.0及以后版本可用。


解决了!原来问题很简单,感谢你指出正确的解决方案! - jrwagz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接