2010-09-28 31 views
19

我已經嘗試了很多方法來實現常規UISlider並控制設備的音量,但它都是Native-C功能,導致許多無法追蹤的錯誤。如何自定義MPVolumeView?

我試過MPVolumeView它像魅力一樣工作,甚至在關閉應用程序後,它甚至可以控制設備音量,就像iPod應用程序一樣。

我的問題是,有沒有辦法自定義帶有特定顏色和圖像的MPVolumeView,就像UISlider

注:我想要一個合法的方法,而不使用私人的無證API。

UPDATE
按@Alexsander埃克斯答案,因爲子視圖隱藏在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]; 
} 
+0

幹得好。很好的工作更新你的問題。 – 2011-02-05 01:14:30

+5

出於好奇,這是在App Store中接受的嗎? – sooper 2012-02-24 00:25:52

+0

@sooper很晚回覆,對不起。不幸的是,我沒有繼續這個應用程序,也沒有提交給App Store。但從個人經驗來看,我看到很多修改原始組件的教程,並且他們被接受。 – medopal 2012-06-27 08:32:33

回答

10

你可以嘗試循環瀏覽子視圖並尋找UISlider子類?

+1

最後,這正是我使用的,爲了清晰起見,我將用代碼更新問題。我希望蘋果不會拒絕這個應用程序。 – medopal 2010-09-29 10:03:16

7

由於的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

+0

iOS 7無法正常工作 – 2014-05-25 05:23:37

+0

完美操作iOS 8! – Genevios 2015-03-19 18:57:41

3

現在有辦法做到這一點,只需使用:

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

它們與香草UISlider的方法名稱略有不同。

這可以防止你不得不循環瀏覽視圖,並且隨着蘋果公司的變化,未來可能會有某些事情中斷。

0

答斯威夫特:

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 
      } 
     } 
    } 

結果:

enter image description here