【问题标题】:How to customize MPVolumeView?如何自定义 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 的方法

标签: iphone avaudioplayer audio-streaming


【解决方案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
                  }
              }
          }
      

      结果:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-05-25
        • 1970-01-01
        • 2011-02-17
        • 1970-01-01
        • 2015-11-14
        • 2012-03-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多