【问题标题】:How to add custom button on AVPlayerViewController in Objective -C iOS?如何在 Objective-C iOS 中的 AVPlayerViewController 上添加自定义按钮?
【发布时间】:2020-08-11 02:26:35
【问题描述】:

我想在 AVPlayerViewController 中添加一个按钮,但我无法做到。我添加了一个按钮[AVPlayerViewController.contentOverlayView addSubview:_btnHandfree];,但是不能点击,这里是截图

也许有上层在那找不到。

【问题讨论】:

    标签: ios objective-c swift iphone ios7


    【解决方案1】:

    试试这个。它可能会有所帮助。

    #import "ViewController.h"
    #import <AVKit/AVKit.h>
    
    @interface ViewController ()
    
    @end
    
    @implementation ViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        // Do any additional setup after loading the view.
    
    
    }
    
    - (void)viewDidAppear:(BOOL)animated {
        [super viewDidAppear:animated];
    
    
        NSURL *url=[[NSBundle mainBundle]URLForResource:@"videoplayback" withExtension:@"mov"];
        AVPlayer *player = [AVPlayer playerWithURL:url];
        AVPlayerViewController *playerViewController = [AVPlayerViewController new];
        playerViewController.player = player;
    
        UIButton *button = [[UIButton alloc] initWithFrame: CGRectMake(20, 100, 100, 50)];
        [button addTarget:self
                   action:@selector(aMethod:) forControlEvents:UIControlEventTouchDown];
    
        [button setTitle:@"Button" forState:UIControlStateNormal];
        [button setTitleColor:[UIColor redColor] forState:UIControlStateNormal];
        [button setBackgroundColor:[UIColor whiteColor]];
    
        [self presentViewController:playerViewController animated:YES completion:^{
          [playerViewController.player play];
        }];
        [self.player addSubview:playerViewController.view];
        [self.view addSubview:button];
    
        for(UIWindow* tempWindow in [[UIApplication sharedApplication]windows]){
            for(UIView* tempView in [tempWindow subviews]){
    
                if ([[tempView description] rangeOfString:@"UIInputSetContainerView"].location != NSNotFound){
                    [tempView addSubview:button];
    
                    break;
                }
            }
        }
    }
    
    -(void)aMethod:(UIButton*)sender {
        NSLog(@"test");
    }
    
    
    @end
    

    【讨论】:

    • [playerViewController.contentOverlayView addSubview:_btnHandfree]; .. 我添加但按钮没有响应
    • 可能是我找不到的某一层
    • 检查此编辑。添加按钮后添加 for 循环。
    • 实际上您不能将按钮添加到您的 playerviewController 内容叠加层。它会向您显示按钮,但在内容叠加层上方还有另一个视图会阻止您触摸按钮。
    【解决方案2】:

    如 Apple 文档中所述。

    在视频内容和播放控件之间显示的视图。

    您可以调试视图层次结构以查看按钮在堆栈中的位置。

    那如果直接添加到视图中呢?

    [AVPlayerViewController.view addSubview:yourButton];
    

    【讨论】:

      【解决方案3】:

      如果您查看视图控制器的视图的子视图,您将看到它的单个视图称为AVPlayerViewControllerContentView。在制作视图控制器时,您可以这样做:

      func showFullScreenVideo(using player: AVPlayer) {
          // setup your player view controller
          let playerViewController = AVPlayerViewController()
          playerViewController.player = player
          present(playerViewController, animated: true) { [weak self] in
            self?.addShareButton(to: playerViewController)
          }
      }
      
      private func addShareButton(to playerViewController: AVPlayerViewController) {
          if let playerContentView = playerViewController.view.subviews.first {
              let someView = SomeView()
              playerContentView.addSubview(someView)
              // use your own layout code:
              someView.constrain(.centerX, .centerY, to: playerContentView)
          }
      }
      

      在完成块内添加共享按钮可确保 playerViewController.view 已加载并可供使用。您可以尝试以多种方式强制加载视图。这是你的选择。另一种可能的方法是在添加分享按钮之前添加这行代码:

      _ = playerViewController.view

      而不是使用完成块。可能有效,也可能无效,但完成块方法肯定有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多