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 路由按钮

4

3 回答 3

11

在审查亚当斯的回答时,我喜欢这项任务更加清晰。因此,我稍微保护了该代码:

目标-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 决定添加另一个按钮或更改顺序,此代码仍然有效。

于 2015-10-08T12:51:55.630 回答
7

要扩展lanbo 的答案,您还可以获取 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)
    }
于 2015-08-10T14:05:14.570 回答
6

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

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

参数

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

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

讨论

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

在 iOS 6.0 及更高版本中可用。

于 2013-09-29T07:25:15.577 回答