【问题标题】:MPMoviePlayerController layout constraint issuesMPMoviePlayerController 布局约束问题
【发布时间】:2014-09-28 17:13:47
【问题描述】:

我正在将一个应用程序移植到 iOS 8。我有一些代码可以播放以前可以播放的视频,但现在无法播放。

当我运行它时,我得到以下错误:

(
"<NSLayoutConstraint:0x7faba2df5940 H:|-(34)-[MPKnockoutButton:0x7faba2e6d750](LTR)   (Names: '|':_UIBackdropContentView:0x7faba2dc38c0 )>",

"<NSLayoutConstraint:0x7faba2d51780 H:[MPKnockoutButton:0x7faba2e6d750]-(34)-[MPDetailSlider:0x7faba2dc6440](LTR)>",

"<NSLayoutConstraint:0x7faba2d5b7f0 H:[MPDetailSlider:0x7faba2dc6440]-(34)-[UIView:0x7faba2dc4060](LTR)>",

"<NSLayoutConstraint:0x7faba2dc5da0 UIView:0x7faba2dc4060.right == _UIBackdropView:0x7faba2dbfdc0.right>",

"<NSLayoutConstraint:0x7faba2dc58d0 H:|-(0)-[_UIBackdropView:0x7faba2dbfdc0]   (Names: '|':MPVideoPlaybackOverlayView:0x7faba2dbf6a0 )>",

"<NSLayoutConstraint:0x7faba2dc5950 H:[_UIBackdropView:0x7faba2dbfdc0]-(0)-|   (Names: '|':MPVideoPlaybackOverlayView:0x7faba2dbf6a0 )>",

"<NSLayoutConstraint:0x7faba2df9b10 H:[MPVideoPlaybackOverlayView:0x7faba2dbf6a0(0)]>",

"<NSAutoresizingMaskLayoutConstraint:0x7faba2dfbfa0 h=-&- v=-&- _UIBackdropContentView:0x7faba2dc38c0.midX == _UIBackdropView:0x7faba2dbfdc0.midX>",

"<NSAutoresizingMaskLayoutConstraint:0x7faba2dfbff0 h=-&- v=-&- _UIBackdropContentView:0x7faba2dc38c0.width == _UIBackdropView:0x7faba2dbfdc0.width>"
)

代码如下:

movieController = [[MPMoviePlayerController alloc]
                 initWithContentURL:[NSURL URLWithString:playlistUrl]];

movieController.movieSourceType = MPMovieSourceTypeStreaming;
[movieController.view setFrame:[self.playerView bounds]];

[self.playerView addSubview:movieController.view];
[movieController play];

有什么想法吗?

【问题讨论】:

    标签: ios8 autolayout


    【解决方案1】:

    这似乎已在 iOS 8.1 中得到修复。升级后错误消失了。

    但是,我确实需要稍微修改我的代码:

    movieController = [[MPMoviePlayerController alloc]
                        initWithContentURL:[NSURL URLWithString:playlistUrl]];
    
    movieController.movieSourceType = MPMovieSourceTypeStreaming;
    
    [movieController.view setTranslatesAutoresizingMaskIntoConstraints:NO];
    [playerView addSubview:movieController.view];
    
    id views = @{ @"player": movieController.view };
    
    [playerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[player]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:views]];
    
    [playerView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[player]|"
                                                                           options:0
                                                                           metrics:nil
                                                                             views:views]];
    [movieController play];
    

    【讨论】:

    • 谢谢,Simon,这为我节省了很多时间!
    【解决方案2】:

    我自己也遇到过这个问题。

    我注意到,即使屏幕上没有 MKMoviePlayerController 视图,在我访问它之前也会出现约束警告。

    这导致我删除了对缩略图生成 API requestThumbnailImagesAtTimes:timeOption:cancelAllThumbnailImageRequests 的调用。

    使用另一种检索缩略图的方法后,警告立即停止。

    虽然我正在加载本地 url,而不是流式传输 - 但我想流式传输机制正在尝试在某处加载缩略图并导致我们看到的问题。

    我没有注意到这个问题的任何书面解决方案或答案,所以我希望我的轶事证据有所帮助。

    【讨论】:

      【解决方案3】:

      对于懒惰的人

      当我想直接使用movieController.view.frame 时,我只需调用

      [movieController.view setTranslatesAutoresizingMaskIntoConstraints:YES];
      

      之前

      [movieController prepareToPlay];
      [self.view addSubview:movieController.view];
      

      不要乱用约束。

      【讨论】:

        猜你喜欢
        • 2019-06-20
        • 2015-04-06
        • 2019-01-06
        • 1970-01-01
        • 2018-07-06
        • 2016-02-04
        • 2020-10-12
        • 1970-01-01
        相关资源
        最近更新 更多