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

Posted

技术标签:

【中文标题】更改 MPVolumeView 路由按钮 iOS 7 的颜色【英文标题】:Change Color of MPVolumeView Route Button iOS 7 【发布时间】:2013-09-29 07:04:14 【问题描述】:

我正在为 ios 7 设计一个音乐应用程序,我想将“AirPlay”路由选择器按钮直接放在我的应用程序中。我可以很好地放置按钮,但是它没有显示,因为图标是白色的,我的背景是白色的。

有没有办法改变Route Button的颜色?

这是我用来创建按钮的代码。

self.airPlayButton = [[MPVolumeView alloc] initWithFrame:CGRectZero];
    self.airPlayButton.showsVolumeSlider = NO;
    [self.airPlayButton sizeToFit];
    self.airPlayButton.backgroundColor = [UIColor myGreenColor];
    [self addSubview:self.airPlayButton];

基本上下面的图片就是我想要的,除了我想要绿色的图标而不是它的背景。

【问题讨论】:

【参考方案1】:

在查看 Adams 的答案时,我希望该任务更加清晰。所以我稍微保护了一下代码:

目标-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 属性做出反应,如果 Apple 决定添加另一个按钮或更改顺序,此代码仍然可以工作。

【讨论】:

这对我来说非常有效!我眼中的最佳解决方案!谢谢! 有没有办法调整airplay按钮连接时的颜色?我已根据您的建议将色调更改为我的颜色,但连接后保持不变。【参考方案2】:

要扩展lanbo's answer,您还可以获取Route Button 的原始图像并创建使用UIImageRenderingMode.AlwaysTemplate 渲染模式的副本。这样它就会注意到当前的tintColor

在斯威夫特中:

    let volumeView = MPVolumeView()

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

【讨论】:

它有效,但确定最后一个视图是图像吗? 不,不能保证,但if let 子句确保它不是UIButton 时是安全的。 为什么是volumeView.routeButtonImageForState(UIControlState.Normal)?.imageWithRenderingMode(UIImageRenderingMode.AlwaysTemplate);不工作?【参考方案3】:

创建自己的图像并尝试 setRouteButtonImage:forState: 将按钮图像分配给指定的控件状态。

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

参数

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

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

讨论

使用它来自定义路由按钮在启用、禁用、突出显示等时的外观。

适用于 iOS 6.0 及更高版本。

【讨论】:

成功了!原来是一个非常简单的解决方案,感谢您为我指出正确的解决方案!

以上是关于更改 MPVolumeView 路由按钮 iOS 7 的颜色的主要内容,如果未能解决你的问题,请参考以下文章

如何扩大 MPVolumeView 路由按钮区域?

音频路由按钮 - AirPlay

AVPlayer、MPVolumeView 和 Volume HUD

更改 MPVolumeView 的滑块

AirPlay 路由按钮可见但没有设备列表

MPVolumeView AirPlay 按钮未显示