如何自定义 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?的主要内容,如果未能解决你的问题,请参考以下文章