神刀安全网

iOS音量控制界面的显示与隐藏

目录

需求

最近在优化项目中的播放器界面,设计师新出了一套UI,其中有一个音量的控制的 UISlider。要求是,在使用手机上的音量调节按钮以及的时候,显示音量调节的界面(系统自带),在使用音量调节的slider的时候,则不显示音量调节的界面,因为本身已经有了一个滑动条了,再加一个系统的略显重复。

总结

如果不想看下面啰哩啰嗦的代码和对原理的猜测,直接看结论在这里。😭
  • MPVolumeView添加到项目中的一个View上并显示在屏幕外后,改变音量就看不到了.

       [_mpVolumeView setFrame:CGRectMake(-100, -100, 40, 40)];    [_mpVolumeView setHidden:NO];    [self.view addSubview:_mpVolumeView];
  • 使用下述2句代码均可实现让MPVolumeView重新可以显示出来,区别是上面一句会在调用后显示音量界面一次,请结合需求使用。

      [_mpVolumeView setHidden:YES];   [_mpVolumeView removeFromSuperview];

实现

实现上下滑动调节音量
  1. 使用UIPanGestrueRecognizer进行滑动手势的识别。

     -(void)panGesture:(UIPanGestureRecognizer *)pan {      CGPoint velocity = [pan velocityInView:pan.view];      CGFloat ratio = 13000.f;          CGFloat nowVolumeValue = _mpVolumeSlider.value;      float changeValue = (nowVolumeValue - velocity.y /     ratio);  }
  2. 拿到MPVolumeViewMPVolumeSlider

     _mpVolumeView = [[MPVolumeView alloc] init];  for (UIView *view in [_mpVolumeView subviews]) {      if ([view.class.description isEqualToString:@"MPVolumeSlider"]) {          _mpVolumeSlider = (UISlider *)view;                  break;         }    }          [_mpVolumeView setFrame:CGRectMake(-100, -100, 40, 40)];          [_mpVolumeView setShowsVolumeSlider:YES];      }
    • MPVolumeView如果不想看到,将frame设置屏幕显示范围之外。
    • setShowsVolumeSlider方法要设置为YES,否则之后的设置会无效化。
  3. panGesture方法中将changeValue赋值给_mpVolumeSilder

     [_mpVolumeSlider setValue:changeValue animated:YES];  [_mpVolumeSlider sendActionsForControlEvents:UIControlEventAllEvents];
  4. 在做完上述步骤后,已经可以拖动调节音量了,并且可以看到系统音量调节界面。

实现拖动slider调节音量
  1. 在界面上放一个UISlider
  2. 添加一个valueChanged的’target’。

     [_mpVolumeView setHidden:NO];  [self.view addSubview:_mpVolumeView];  [_mpVolumeSlider setValue:sender.value animated:NO];
    • 系统的MPVolumeViewHidden设置为YES会导致MPVolumeView出现在你的屏幕中央。
    • 想要隐藏音量设置界面,将MPVolumeViewhidden设置为NO,并添加到自己的view上,这样会导致系统判断你已经将这个view添加到你的项目中的view上,就不会在系统层面的window上显示MPVolumeView了。做出这样的假设是因为我在显示出MPVolumeView的时候看项目层级的时候是看不到MPVolumeView的。
  3. 但是现在有个问题,那就是使用音量调节按钮和滑动调节的时候,也不显示音量界面了。

    • slider添加UIControlEventTouchUpInsidetarget。在相应事件中添加

      [_mpVolumeView removeFromSuperview]; //将`_mpVolumeView`移除后,使用按钮和滑动的时候,系统判断你没有添加,然后就在系统`window`的层面上显示了。
    • panGesture中设置

      [_mpVolumeView setHidden:YES]; //上述代码同样可以达到显示音量调节界面的效果,在`target`中不用的原因是调用这句代码的时候会显示音量界面一次,与我们的需求不太符合。

Demo

Demo地址

转载本站任何文章请注明:转载至神刀安全网,谢谢神刀安全网 » iOS音量控制界面的显示与隐藏

分享到:更多 ()

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址