2010-07-19 91 views
3

據我所知,MPVolumeView可以添加到我的應用程序來改變音量。但現在我想用自定義滑塊控制音量。 也許如果MPVolume是uislider的一個子類,我自己可以適合它,的確,它是uiview的一個子類。 尋求意見,實現我的想法,非常感謝。我可以使用自定義滑塊來控制音量嗎?

回答

4
UIView *a=[[UIView alloc] init]; 
    for (UIView *view in [volumeSlider subviews]) { 
     if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) { 
      a=view; 
      [(UISlider *)a setThumbImage:[UIImage imageNamed:@""] forState:UIControlStateNormal]; 
      [(UISlider *)a setMinimumTrackImage:[UIImage imageNamed:@"volume2.png"] forState:UIControlStateNormal]; 
      [(UISlider *)a setMaximumTrackImage:[UIImage imageNamed:@"volume3.png"] forState:UIControlStateNormal]; 
    } 

    } 

,可以做我想做的,但我真的不知道,如果它可以通過蘋果的檢查

+1

這是否通過了蘋果的審查? – Moshe 2011-02-04 21:00:07

+2

它已通過審查,現在在appstore! – ben 2011-02-14 05:37:08

+1

而不是比較類的描述字符串,我會使用'[view isKindOfClass:[UISlider class]]'代替。看起來更清潔,加上MPVolumeSlider是一個UISlider子類,這樣你的二進制文件中就沒有私有類名。 – DarkDust 2012-04-10 12:51:34

2

Hummm,你可以製作自己的滑塊,但它不會控制你想要的播放器的音量。您將不得不使用CoreAudio和CoreMedia等低級框架。

爲什麼不子類MPVolumeView?我從來沒有嘗試繼承MPVolumeView ,但您可以通過添加一些類別來訪問@protected的子類和@private類的東西。您可能需要查看MPVolumeView的標題以查看是否有可以自定義的UISlider(或其他)。

更新:(2010/07/21)

我明白了。讓我問你一件事。爲什麼需要將UIProgressView添加到VolumeView?一般來說,你會將它添加到播放器播放,但它的音量正確嗎?音量不會像流式傳輸音頻或視頻那樣加載?

其次,我剛看到MPVolumeView的標題。它有一個私人的,也隱藏類名爲MPVolumeViewInternal * _internal; 當你有這些類,如果非常難以定製而不被拒絕(當提交你的應用程序到AppStore時) 你可以創建一個類別並訪問_internal var,但是爲了使用_internal,你將不得不使用它的頭部,並且這意味着使用不允許的私有頭文件和框架。

或者您可以看看Objective-C runtime Reference中的函數,然後嘗試諸如drawnonward之類的建議來查找要修改的對象的UISlider。 使用Obj-C運行時功能是大多數技巧或易於破解的功能;)

+0

我真的想知道,我是否可以添加其他東西到API的class.i希望so.thank你 – ben 2010-07-19 05:45:22

+0

你可以更具體地說明你想要添加什麼嗎? – nacho4d 2010-07-19 06:53:47

+0

我想在拇指和UISlider的軌道之間插入一個UIProcess。 – ben 2010-07-20 07:08:51

3

如果您走MPVolumeView的視圖層次結構並碰巧找到UISlider,則可以隨時對其進行自定義。

for (view in theVolumeView.subviews) { 
    if ([view isKindOfClass:[UISlider class]]) { ... } 
} 

注意,還會有其他的意見,並有可能不是一個UISlider,所以不作任何假設。您可能想要遞歸地遍歷層次結構。

+0

哦,在MPVolumeView中沒有任何類的uislider成員,但有3個子視圖,我想查找它們是什麼~~ – ben 2010-07-19 05:39:13

+0

您的意思是kindOfClass :. – 2010-07-19 19:20:47

+0

@tc謝謝,我總是混合起來。 – drawnonward 2010-07-20 03:54:13

1

做一個UIView在Interface Builder對MP框架 包括在MediaPlayer的頭 鏈接您的頭文件與包含您剛製作的UIView的XIB相對應 將您剛剛創建的視圖的類更改爲MPVolumeView

它在模擬器上不起作用,但它在設備上起作用。

0

另一種選擇是使用自定義滑蓋MPMusicPlayerController

MPMusicPlayerController *controller = [MPMusicPlayerController applicationMusicPlayer]; 
controller.volume = 0.5; // value in [0,1] 
0

這裏是一個自定義的音量滑塊的全部代碼。它已經過測試並可用於xcode 4.6。1

MPVolumeView *volumeView = [[[MPVolumeView alloc] initWithFrame:volumeSlider.bounds] autorelease]; 


    UIView *a=[[UIView alloc] init]; 
    for (UIView *view in [volumeView subviews]) { 
     if ([[[view class] description] isEqualToString:@"MPVolumeSlider"]) { 
      a=view; 
      [(UISlider *)a setThumbImage:[UIImage imageNamed:@"slider_thumb.png"] forState:UIControlStateNormal]; 
      [(UISlider *)a setMinimumTrackImage:[UIImage imageNamed:@"slider_progress.png"] forState:UIControlStateNormal]; 
      [(UISlider *)a setMaximumTrackImage:[UIImage imageNamed:@"slider_bg.png"] forState:UIControlStateNormal]; 
     } 

    } 

    [volumeSlider addSubview:volumeView]; 
    [volumeView sizeToFit]; 

你可以在頂部或更容易修改後的頭文件聲明圖像名稱

相關問題