如何自定义 MPVolumeView?

Posted

技术标签:

【中文标题】如何自定义 MPVolumeView?【英文标题】:How to customize MPVolumeView? 【发布时间】:2011-04-18 08:04:55 【问题描述】:

我尝试了很多方法来实现一个常规的UISlider 并控制设备音量,但都是Native-C 函数导致许多无法追踪的错误。

我尝试了MPVolumeView,它的作用就像是魅力一样,即使在你关闭应用程序后它甚至可以控制设备音量,就像 iPod 应用程序一样。

我的问题是,有没有像UISlider 那样用特定的颜色和图像自定义MPVolumeView

注意:我想要一个合法的方法,而不使用私有的未记录的 API。

更新 根据@Alexsander Akers 的回答,由于子视图隐藏在MPVolumeView 中,我不得不循环浏览子视图,获取UISlider 并对其进行自定义,这是代码。

IBOutlet UISlider *volumeSlider;   //defined in <class.h> and connected to a UISlider in Interface Builder

-(void) viewDidLoad 
     ....
     [self setCustomSlider];
     ....


-(void) setCustomSlider
     MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:[volumeSlider frame]] autorelease];
     NSArray *tempArray = volumeView.subviews;

     for (id current in tempArray)
           if ([current isKindOfClass:[UISlider class]])
                    UISlider *tempSlider = (UISlider *) current;
                    UIImage *img = [UIImage imageNamed:@"trackImage.png"];
                    img = [img stretchableImageWithLeftCapWidth:5.0 topCapHeight:0];
                    [tempSlider setMinimumTrackImage:img forState:UIControlStateNormal];

                    [tempSlider setThumbImage:[UIImage imageNamed:@"thumbImage.png"] forState:UIControlStateNormal];

            
    
    [volumeSlider removeFromSuperview];
    [self.view addSubview:volumeView];
 

【问题讨论】:

干得好。很高兴更新您的问题。 只是出于好奇,App Store 接受了吗? @sooper 回复太晚了,抱歉。不幸的是,我没有继续这个应用程序,也从未将它提交到 App Store。但从个人经验来看,我看过很多修改原始组件的教程,都被接受了。 请注意,在 ios 6 中,内置了自定义 MPVolumeView 滑块的方法,类似于 UISlider 的方法 【参考方案1】:

您可以尝试循环浏览其子视图并寻找 UISlider 子类?

【讨论】:

最后这正是我使用的,为了清楚起见,我将用代码更新问题。我希望 Apple 不会因此拒绝该应用程序。【参考方案2】:

尝试使用Notification,但它看起来像Apple is denying them.


[编辑]

Try this。

【讨论】:

【参考方案3】:

iOS 5.0 开始,您可以在 UISlider 上使用 UIAppearance,即使是 MPVolumeView 的一部分。

代码库中的任何位置:

[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMinimumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_full.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setMaximumTrackImage:[[UIImage imageNamed:@"nowplaying_bar_empty.png"] resizableImageWithCapInsets:UIEdgeInsetsMake(5, 25, 5, 25)] forState:UIControlStateNormal];
[[UISlider appearanceWhenContainedIn:[MPVolumeView class], nil] setThumbImage:[UIImage imageNamed:@"nowplaying_player_nob.png"] forState:UIControlStateNormal];

这里列出了一些可以使用 UIAppearance 实现的其他类: https://gist.github.com/mattt/5135521

【讨论】:

完美运行 iOS 8!【参考方案4】:

现在有很多方法可以做到这一点,只需使用:

– setMaximumVolumeSliderImage:forState:
– setMinimumVolumeSliderImage:forState:
– setVolumeThumbImage:forState:

与原版UISlider 的方法名称略有不同。

这可以防止您不得不循环浏览视图,并且可能在未来随着 Apple 的更改而出现问题。

【讨论】:

【参考方案5】:

用 Swift 回答:

func customSlider() 
        let temp = mpVolView.subviews
        for current in temp 
            if current.isKind(of: UISlider.self) 
                let tempSlider = current as! UISlider
                tempSlider.minimumTrackTintColor = .yellow
                tempSlider.maximumTrackTintColor = .blue
            
        
    

结果:

【讨论】:

以上是关于如何自定义 MPVolumeView?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 iOS 中自定义 MPVolumeView?

更改 MPVolumeView 的滑块

MPVolumeView Airplay 仅在镜像时触摸

MPVolumeView 的滑块 setVolumeThumbImage:forState: 在 iOS5 上不起作用

如何正确设置 MPVolumeView 的最大和最小图像

使用 MPVolumeView 后如何重新打开系统音量覆盖?