3

ご存知のように、MPVolumeViewは音量を変更するためにアプリに追加できますが、今度はカスタムスライダーで音量を制御したいと思います。MPVolumeがuisliderのサブクラスである場合、おそらく私はそれを自分で適合させることができます。実際、それはuiviewのサブクラスです。私の考えを実現するためのアドバイスをお願いします、どうもありがとうございました。

4

6 に答える 6

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

    }

それは私が望むことをすることができます、しかし私はそれがリンゴのチェックに合格できるかどうか本当にわかりません

于 2010-07-19T07:24:59.857 に答える
3

MPVolumeViewのビュー階層を歩き、UISliderを見つけた場合は、いつでもカスタマイズできます。

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

他のビューがあり、UISliderがない可能性があることに注意してください。したがって、仮定を行わないでください。階層を再帰的にトラバースすることをお勧めします。

于 2010-07-19T04:27:31.470 に答える
2

うーん、あなたはあなた自身のスライダーを作ることができました、しかしそれはあなたが望むプレーヤーの音量を制御しません。CoreAudioやCoreMediaなどの低レベルのフレームワークを使用する必要があります。

MPVolumeViewをサブクラス化しないのはなぜですか?MPVolumeViewのサブクラス化を試したことはありませんが、サブクラス化することで@protectedのものにアクセスでき、いくつかのカテゴリを追加することで@privateのものにアクセスできます。MPVolumeViewのヘッダーを調べて、カスタマイズ可能なUISlider(または何か)があるかどうかを確認することをお勧めします。

更新:(2010/07/21)

そうか。何か聞いてみよう。UIProgressViewをVolumeViewに追加する必要があるのはなぜですか?一般的に、それをプレーヤーの再生に追加しますが、その音量には追加しますか?オーディオやビデオのストリーミングのように音量が読み込まれませんか?

次に、MPVolumeViewのヘッダーを見たところです。また、MPVolumeViewInternal*_internalという名前のプライベートな非表示のクラスがあります。この種のクラスがある場合、拒否されずにカスタマイズするのが非常に難しい場合(AppStoreにアプリを送信する場合)、カテゴリを作成して_internal varにアクセスできますが、_internalを使用するには、ヘッダーが必要です。これは、許可されていないプライベートヘッダーとフレームワークを使用する。

または、 Objective-Cランタイムリファレンスの関数を見て、drawonwardのようなものを試して、変更するオブジェクトのUISliderを見つけることもできます。Obj-Cランタイム関数の使用は、ほとんどのトリックまたはイージーハックが行われる方法です;)

于 2010-07-19T04:19:38.923 に答える
1

InterfaceBuilderでUIViewを作成しますMPフレームワークに対するリンク作成したばかりのUIViewを含むXIBに対応するヘッダーファイルにMediaPlayerヘッダーを含めます作成したビューのクラスをMPVolumeViewに変更します

シミュレーターでは機能しませんが、デバイスでは機能します。

于 2011-12-22T16:06:50.107 に答える
0

別のオプションは、カスタムスライダーをMPMusicPlayerController次のように使用することです。

MPMusicPlayerController *controller = [MPMusicPlayerController applicationMusicPlayer];
controller.volume = 0.5; // value in [0,1]
于 2012-10-17T21:12:06.060 に答える
0

これがカスタムボリュームスライダーの完全なコードです。テストされ、xcode4.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];

後で簡単に変更できるように、画像名を上部またはヘッダーファイルで宣言できます

于 2013-04-11T10:24:35.997 に答える