【问题标题】:Add Custom Controls to MoviePlayer将自定义控件添加到 MoviePlayer
【发布时间】:2008-10-10 08:14:09
【问题描述】:

我想弄清楚如何将自定义控件添加到 iPhone MoviePlayer。 有关我正在尝试执行的操作的示例,请参见下图。

我正在尝试在基本电影控件的右侧和左侧添加类似控件。

我在 Open SDK 中通过向播放器视图添加子类来完成此操作,但现在在官方 SDK 和 Apple 移动到 MPMoviePlayerController 我不知道该怎么做。

此外,使用我的旧 1.x 固件方式,它需要我自己捕获触摸事件并隐藏/显示控件。我希望有一种方法可以使用标准控件执行此操作,但如果没有,那也没关系。

提前致谢。

【问题讨论】:

    标签: iphone objective-c cocoa-touch


    【解决方案1】:

    我找到了最好的方法!

    您像平常一样创建电影播放器​​,然后执行以下操作:

    id vvController = [theMovie videoViewController];
    [[vvController _overlayView] addSubview:mainView];
    

    “mainView”是您的自定义叠加层。这样做可以使您的自定义叠加层与普通叠加层一起显示和隐藏,因为它们现在是同一个!

    请注意,这仍然使用标准框架,但在框架中没有记录。所以它应该是 100% 应用商店安全的,但在以后的框架中“可能”在没有 Apple 通知的情况下发生变化。

    【讨论】:

    • 你们知道是否可以创建除媒体播放器之外的自定义控件吗?比如逐帧播放?
    • 您可以创建控件,但这些控件的功能仅限于您可以使用 SDK 执行的操作。例如,我显示了一个评级控件,并在评级时将其发送到服务器。您想要的是能够告诉玩家向前移动 1 帧并停止,这是您目前无法做到的。如果需要,请在 bugreporter.apple.com 上提交功能请求。
    • 请提供带有自己控件的自定义视频播放器的任何示例代码
    • 在“标准框架”中没关系,它是一个私有方法,因此不允许!
    • 这会让你的应用被拒绝。
    【解决方案2】:

    这里的人们可能还在其他各种博客文章中看到了以下“获取电影播放器​​窗口”的方法——索引 = 1。虽然这种方法(见下面的 sn-p)也可能有点“脆弱” ",它可能有点“更安全”,因为它确实不使用 MPMoviePlayerController 中的任何未记录或非公共方法。

    还请注意,您应该等到收到 MPMoviePlayerContentPreloadDidFinishNotification,这样电影播放器​​窗口 (idx=1) 才会确实存在 ;-)

    注意,我还在此处为 myOverlayView 分配了一个任意(整数值)视图“标签”——以便我可以在可能的情况下重复使用该视图,即检查它是否已添加到父播放器窗口。

    anyhoo,这是相关的代码-sn-p:

    // use slight "hack" to get our (parent) movie-player window, should always (?) be the UIWindow at index = 1
    //
    UIWindow *moviePlayerWindow= [[[UIApplication sharedApplication] windows] objectAtIndex:1];
    
    myOverlayView.center = CGPointMake(
                                moviePlayerWindow.bounds.size.width - (myOverlayView.bounds.size.height / 2) - myOverlayView.display_origin.y,
                                moviePlayerWindow.center.y
                                      ); // center our overlay-view
    
    myOverlayView.hidden = NO; // and show it
    
    if( [moviePlayerWindow viewWithTag: MY_OVERLAY_VIEW_TAG] == nil ) {
        // haven't added our overlay-view as a sub-view to the main MoviePlayer window yet... so do that now
        myOverlayView.tag = MY_OVERLAY_VIEW_TAG;
        [moviePlayerWindow addSubview: myOverlayView];
    }
    [moviePlayerWindow bringSubviewToFront: myOverlayView]; // in any case, bring it to the foreground
    

    【讨论】:

    • 也许我没有正确解释您的理论,但我的自定义控件并未与其他播放器控件一起隐藏。这段代码应该允许吗?
    【解决方案3】:

    Apple 提供的This sample application 应该会有所帮助。来自描述:

    演示如何使用媒体 播放器框架播放电影 全屏。示例包含代码 配置电影背景 颜色、播放控制和缩放 通过内置设置模式 应用。还展示了如何绘制 顶部的自定义覆盖控件 播放中的电影。

    【讨论】:

    • 这适用于添加自定义控件,但它不会与默认控件切换。该示例显示了如何在您自己的自定义控件中捕捉触摸,但它们显示的内容将无法隐藏您的控件。您仍然需要捕捉其他点击才能隐藏您的控件。
    【解决方案4】:

    我推荐 VideoPlayerKit。支持流媒体、全屏、AirPlay。

    https://github.com/ign/VideoPlayerKit

    【讨论】:

    【解决方案5】:

    我还没有实现 ALMoviePlayerController,但它似乎为您的问题提供了一个简洁而充分的解决方案。

    来自 git 仓库:

    “MPMoviePlayerController 的插入式替代品,可公开 UI 元素并允许最大程度的自定义”

    https://github.com/alobi/ALMoviePlayerController

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 1970-01-01
      • 2010-11-12
      • 1970-01-01
      • 2011-11-10
      • 1970-01-01
      • 2017-08-21
      相关资源
      最近更新 更多