MPMoviePlayerController在Cocos2D中导致约束警告

时间:2014-10-01 02:34:37

标签: ios objective-c cocos2d-iphone nslayoutconstraint

我正在使用Cocos2D for iOS中的游戏,并在控制台中看到许多与约束相关的警告。我已在SO和其他网站上阅读了许多与约束相关的帖子,但未能解决此问题。

我有没有 NIB文件,并且在此项目中没有使用过XCodes用户界面构建器。 Cocos2D只使用以编程方式创建的全屏GLView。据我所知,所有这些约束来自与UIView本身交互的MPMoviePlayerController。

我正在使用此代码进行MPMoviePlayerController集成:https://github.com/cocos2d/cocos2d-iphone-extensions/blob/master/Extensions/CCVideoPlayer/iOS/CCVideoPlayerImpliOS.m

进行一些细微的更改以显示视频非全屏,并在iOS8上进行编译:

- (void) setupViewAndPlay
{
    UIWindow *keyWindow = [[UIApplication sharedApplication] keyWindow];    

    CGSize viewSize = [[CCDirector sharedDirector] viewSizeInPixels];

    // We want to show these animations windowed - not full screen
    // Native resolution of the movie is 480p = 640x360
    CGRect videoFrame = CGRectMake( 0, 0, 640, 360);
    if (viewSize.height < 768)
    {
        // On the iphone play at 1/2 size
        videoFrame = CGRectMake(0, 0, 320, 180);
    }
    videoFrame.origin.x = (viewSize.width - videoFrame.size.width) / 2.0f;
    videoFrame.origin.y = (viewSize.height - videoFrame.size.height) / 2.0f;
   [keyWindow addSubview: [_theMovie view]];
    [[_theMovie view] setHidden:  NO];
    [[_theMovie view] setFrame: videoFrame];
    [[_theMovie view] setCenter: keyWindow.center ];
    [keyWindow setAutoresizesSubviews:NO];
    [self updateOrientationWithOrientation: (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation]];

    // Movie playback is asynchronous, so this method returns immediately.
    [_theMovie play];
}

以下是我看到的警告:

2014-10-01 11:32:45.360 SpaceBotAlpha[182:4484] Unable to simultaneously satisfy constraints.
    Probably at least one of the constraints in the following list is one you don't want. Try this: (1) look at each constraint and try to figure out which you don't expect; (2) find the code that added the unwanted constraint or constraints and fix it. (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

(
    "<NSLayoutConstraint:0x17774f20 H:|-(34)-[MPKnockoutButton:0x177db4e0](LTR)    (Names: '|':_UIBackdropContentView:0x18c7e040 )>",
    "<NSLayoutConstraint:0x17774f50 H:[MPKnockoutButton:0x177db4e0]-(34)-[MPDetailSlider:0x18cb1f60](LTR)>",
    "<NSLayoutConstraint:0x17774f80 H:[MPDetailSlider:0x18cb1f60]-(34)-[UIView:0x18cb6780](LTR)>",
    "<NSLayoutConstraint:0x17774fb0 UIView:0x18cb6780.right == _UIBackdropView:0x18caec50.right - 34>",
    "<NSLayoutConstraint:0x18cafac0 H:|-(0)-[_UIBackdropView:0x18caec50]   (Names: '|':MPVideoPlaybackOverlayView:0x1778ad80 )>",
    "<NSLayoutConstraint:0x18cc77b0 H:[_UIBackdropView:0x18caec50]-(0)-|   (Names: '|':MPVideoPlaybackOverlayView:0x1778ad80 )>",
    "<NSAutoresizingMaskLayoutConstraint:0x1776da10 h=-&- v=-&- _UIBackdropContentView:0x18c7e040.midX == _UIBackdropView:0x18caec50.midX>",
    "<NSAutoresizingMaskLayoutConstraint:0x1776da40 h=-&- v=-&- _UIBackdropContentView:0x18c7e040.width == _UIBackdropView:0x18caec50.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x177aa050 h=-&- v=-&- MPVideoPlaybackOverlayView:0x1778ad80.width == MPVideoContainerView:0x1778b8e0.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x1775e480 h=-&- v=-&- MPVideoContainerView:0x1778b8e0.width == MPSwipableView:0x18cba6f0.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x177a8ce0 h=-&- v=-&- MPSwipableView:0x18cba6f0.width == MPMovieView:0x177c7eb0.width>",
    "<NSAutoresizingMaskLayoutConstraint:0x17766310 h=--& v=--& H:[MPMovieView:0x177c7eb0(0)]>"
)

Will attempt to recover by breaking constraint 
<NSLayoutConstraint:0x17774f50 H:[MPKnockoutButton:0x177db4e0]-(34)-[MPDetailSlider:0x18cb1f60](LTR)>

Make a symbolic breakpoint at UIViewAlertForUnsatisfiableConstraints to catch this in the debugger.
The methods in the UIConstraintBasedLayoutDebugging category on UIView listed in <UIKit/UIView.h> may also be helpful.

我发现的关于约束的所有帖子都假定已经使用了界面构建器。

任何线索?谢谢!


万一有人发现这篇文章寻找关于轮换的信息:我注意到在iOS8上有一些奇怪的事情,MPMoviePlayerController似乎会自动旋转到正确的方向,如果我离开updateOrientationWithOrientation方法as-is(参见GitHub链接)然后它出现在所需的90度。所以在iOS8上我检测到updateOrientationWithOrientation中的版本并退出而不在iOS8上做任何事情。

4 个答案:

答案 0 :(得分:9)

我遇到了同样的限制问题。然而,sez的回答并不适合我,所以我挖了一点。在我的情况下,问题是在设置视频控制器视图的帧并将其添加到超级视图之前调用[videoConroller prepareToPlay]

我正在创建我的MPMoviePlayerController的实例,并在viewDidLoad中调用prepareToPlay,因为此时我有了url。但是,我等到viewDidAppear实际调整视频播放器的大小并将其添加到视图层次结构中。

在将视图添加到层​​次结构后,只需将该方法调用移动即可解决我的问题。此外,我能够拥有一个与父视图边界不匹配的框架。

答案 1 :(得分:8)

您是否尝试使用MPMoviePlayerViewController而不是MPMoviePlayerController? (这个对我有用 :-)) 然后将translatesAutoresizingMaskIntoConstraints设置为YES。 就像这样:

     MPMoviePlayerViewController *moviePlayerViewController = [MPMoviePlayerViewController new];
    [moviePlayerViewController.view setTranslatesAutoresizingMaskIntoConstraints:YES];

我希望这对你有用!..

答案 2 :(得分:3)

好的,我最终通过摆脱我试图破解的CCVideoPlayer extension并直接使用MPMoviePlayerController来解决这个问题。当我开始做Mac时,我将不得不为此推出新的解决方案。

摆脱约束消息的关键是电影视图的窗口大小必须与其超视图大小相匹配。为此,我在代码中构造了一个具有正确大小和位置的UIView,并使MPMoviePlayerController的视图成为其中的一个。

以下是该代码的一部分:

_videoFrameView = [[UIView alloc] initWithFrame:frameUI];
[_videoFrameView setBackgroundColor:[UIColor redColor]];
[mainView addSubview:_videoFrameView];

_movie = [[MPMoviePlayerController alloc] init];
[_movie setRepeatMode:(MPMovieRepeatModeNone)];
[_movie setControlStyle:MPMovieControlStyleNone];
[_movie setScalingMode:MPMovieScalingModeAspectFit];
[_movie setMovieSourceType:(MPMovieSourceTypeStreaming)];
CGRect movieFrame;
movieFrame.size = frameUI.size;
[[_movie view] setFrame:movieFrame]; // player's frame size must match parent's

[_videoFrameView addSubview: [_movie view]];
[_videoFrameView bringSubviewToFront:[_movie view]];

该方法的更详细的粘贴是shown in this gist。我的方法基于this other answer中显示的想法。

答案 3 :(得分:0)

在iOS 9.1.2下面的行已解决。此警告反复打印,直到我重新启动应用程序。这些线解决了它。

moviePlayerController = [[MPMoviePlayerController alloc]initWithContentURL:videoUrl];
    [moviePlayerController.view setTranslatesAutoresizingMaskIntoConstraints:NO];