4

私はもともとMPVolumeViewを動的にページに追加しました...

#import "MediaPlayer/MPVolumeView.h"
.
.
-(IBAction) handleVolumeButtonClicked:(id) sender {
    if (volumeView == nil) {
        volumeView = [[MPVolumeView alloc] initWithFrame:CGRectMake(25, 378, 270, 30)];
        [self.view addSubview:volumeView];
        [volumeView release];
    } else {
        [volumeView removeFromSuperview];
        volumeView = nil;
    }
}

しかし、何らかの理由で、ボリュームコンポーネントを動的に追加すると、アプリケーションがクラッシュするというレポートを受け取り始めました。

これを回避するために、XCodeデザイナを介してコンポーネントをビューに追加することにしましたが、これを行う方法がわからないことに気付きました。

最初に「オブジェクト」をテンプレートからオブジェクトパレットにドラッグしましたが、ビューに追加できないことがわかりました。そこで、そのアイデアを破棄してから、「View」オブジェクトを.xibビューに直接ドラッグしました。

コンポーネントが追加されたら、「カスタムクラス」を「MPVolumeView」に変更しようとしましたが、ビューは空の長方形をレンダリングしました。シミュレーターでコードを実行すると、何もレンダリングできませんでした。

パレットにまだ存在しないクラスをビューに追加するために私が見逃しているステップを誰かが知っていますか?

4

6 に答える 6

23

汎用UIViewを追加し、カスタムクラスをMPVolumeViewに設定することは実際に機能します。必ず次のことを行ってください。

  • MediaPlayerフレームワークをプロジェクトに追加します。そうしないと、MPVolumeViewのロードは(コンソールにメッセージが記録されていても)サイレントに失敗します。
  • 実際のデバイスで実行します。シミュレーターはボリュームスライダーを表示しません。
  • ビューがビューから自動サイズ変更されていないことを再確認してください。
于 2012-08-30T13:11:15.443 に答える
5

シミュレーターではなく、iOSデバイスでアプリを実行してみてください。シミュレーターでは、MPVolumeViewは「ボリュームがありません」を白いテキストで表示します。ビューの背景色が白(Interface Builderのデフォルト)に設定されている場合、ビューは空のように見えます。

于 2011-06-24T17:18:08.190 に答える
4

さらに簡単:

ビューを追加し、クラスをMPVolumeViewに変更して、.hで宣言します

    #import <MediaPlayer/MediaPlayer.h>

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeview;
}

.mでそれを割り当てるだけです。

- (void)viewDidLoad {
    [super viewDidLoad];
    [MPVolumeView alloc];

    // set properties using the declared object in .h
    // Example
    [mpVolumeview setShowsVolumeSlider:NO]; 
}
于 2014-01-15T12:38:35.500 に答える
1

私はRomanAliyevの決定を少し変えました。

MPVolumeViewをUISliderのサブクラスとして設定できます

@IBOutlet weak var volume: MPVolumeView!

let volumeSetting = volume.subviews.first as? UISlider
    volumeSetting?.minimumValueImage = UIImage(named: "SoundQuiet")
    volumeSetting?.maximumValueImage = UIImage(named: "SoundLoud")
    ...
于 2019-09-08T11:32:17.693 に答える
0

別の解決策を見つけました。

  • XcodeInterfaceBuilderを介してUISliderを追加します。
  • IBでの外観を構成します。
  • プログラムで、次の方法でMPVolumeViewに置き換えます。
class PlayerView: UIView {
    @IBOutlet weak var volumeViewMock: UISlider!

    override func awakeFromNib() {
        super.awakeFromNib()
        self.volumeViewMock.replaceWithMPVolumeView()
    }
}

extension UISlider {
    func replaceWithMPVolumeView() {
        // do this only once
        guard !self.isHidden else { return }

        let volumeView = MPVolumeView()
        volumeView.showsRouteButton = false

        // get the slider of volumeView and configure it in the same way as the IB slider
        guard let volumeViewSlider = volumeView.subviews.first as? UISlider else { return }
        volumeViewSlider.minimumValueImage = self.minimumValueImage
        volumeViewSlider.maximumValueImage = self.maximumValueImage
        volumeViewSlider.tintColor = self.tintColor
        volumeViewSlider.minimumTrackTintColor = self.minimumTrackTintColor
        volumeViewSlider.maximumTrackTintColor = self.maximumTrackTintColor
        volumeViewSlider.thumbTintColor = self.thumbTintColor

        guard let parentView = self.superview else { return }
        parentView.addSubview(volumeView)

        // frame of volumeView and frame of the IB slider should be the same
        volumeView.translatesAutoresizingMaskIntoConstraints = false
        NSLayoutConstraint.activate([
            volumeView.topAnchor.constraint(equalTo: self.topAnchor),
            volumeView.bottomAnchor.constraint(equalTo: self.bottomAnchor),
            volumeView.leadingAnchor.constraint(equalTo: self.leadingAnchor),
            volumeView.trailingAnchor.constraint(equalTo: self.trailingAnchor),
            ])

        // hide the IB slider
        self.isHidden = true
    }
}
于 2019-04-15T12:55:54.863 に答える
-1

あなたが今までにこれを理解したかどうかはわかりません。ボリュームスライダーを使ってアプリを作成しました。これが私がしたことです(MPVolumeViewから):

  • UIViewを追加し、必要に応じてサイズを変更して.xibビューに配置しました。
  • クラスをに変更しましたMPVolumeView
  • 私の.hファイルに以下を追加しました:
#import 

@interface MyView : UIViewController {
    MPVolumeView *_mpVolumeViewParentView;
}
@property (nonatomic, retain) IBOutlet MPVolumeView *mpVolumeViewParentView;

@end
  • 私の.mファイルに以下を追加しました:
#import "MyView.h"

@implementation MyView

@synthesize mpVolumeViewParentView = _mpVolumeViewParentView;

- (void)viewDidLoad {
    [super viewDidLoad];
    [[self mpVolumeViewParentView] setBackgroundColor:[UIColor clearColor]];
    MPVolumeView *myVolumeView = [[MPVolumeView alloc] initWithFrame:[[self mpVolumeViewParentView] bounds]];
    [[self mpVolumeViewParentView] addSubview:myVolumeView];
    [myVolumeView release];
}
- (void)dealloc {
    [_mpVolumeViewParentView release];
    [super dealloc];
}

それが役に立てば幸い。

于 2011-09-17T17:36:02.707 に答える