ObjecTips

Swift & Objective-C で iOS とか macOS とか

iPhone 本体の音量を変更する その2

koze.hatenablog.jp

前回は結局 Private API を使うとできるという話になってしまったので今回は正攻法で。

MPVolumeView を使う。
UIが提供されるのみで programmatically に設定はできない。
UIはこんな感じ。

f:id:Koze:20150412021546p:plain

分かりやすく以下のコードで border を描画している。

    view.layer.borderColor = [UIColor colorWithWhite:0.0 alpha:0.2].CGColor;
    view.layer.borderWidth = 1;

注意点は2つ

  • Apple TVなどへ接続するためのスライダーの右側の routeButton が白色なので、背景が白色のViewに置くとボタンが見えない。
    背景白色Viewに置きたければ以下のメソッドで画像を変更する。
- (void)setRouteButtonImage:(UIImage *)image forState:(UIControlState)state NS_AVAILABLE_IOS(6_0);
  • border の線から分かるように、スライダーのThumb画像がViewの frame からはみ出してしまっている。
    MPVolumeView を乗せるViewが clipToBounds = YESMPVolumeView ギリギリ分のサイズだった場合に、スライダーのThumbがクリップされてしまう。
    また、MPVolumeView をツメツメでレイアウトした場合も MPVoumeViewの真上に来るViewとの階層関係によってはThumb画像が隠れてしまう恐れがある。
    以下のメソッドでThumb画像を変更するか、レイアウトを気を付けるかして対応する必要がある。
- (void)setVolumeThumbImage:(UIImage *)image forState:(UIControlState)state NS_AVAILABLE_IOS(6_0);

MPVolumeView をUIに配置するのではなく、MPVolumeView 付きの Alert を呼び出す function がある。

MP_EXTERN void MPVolumeSettingsAlertShow();
MP_EXTERN void MPVolumeSettingsAlertHide();
MP_EXTERN BOOL MPVolumeSettingsAlertIsVisible();

iOS 2.0から存在しているらしいけどこれ初めて見た。
UIには呼び出しボタンを置くだけで済むので場所を取らなくて良いかも。

f:id:Koze:20150412021556p:plain

追記

MP_EXTERN void MPVolumeSettingsAlertShow();
MP_EXTERN void MPVolumeSettingsAlertHide();
MP_EXTERN BOOL MPVolumeSettingsAlertIsVisible();

上記3つの関数は iOS 11.3 β で deprecated になりました。