MPMoviePlayerController raises constraint warnings in Cocos2D

I am working on a game in Cocos2D for iOS and am seeing a lot of restrictions related warnings in the console. I have read many limitation related posts here on SO and other sites but have not been able to resolve this issue.

I have no NIB files and have not used the XCodes UI builder in this project. Cocos2D just uses a programmatically generated full screen GLView. As far as I can tell, all of these limitations come from the MPMoviePlayerController interacting with the UIView itself.

I am using this code to integrate MPMoviePlayerController:

with some minor changes to show the video not full screen and get it to compile on 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 setAutoresizesSubviews:NO];
    [self updateOrientationWithOrientation: (UIDeviceOrientation)[[UIApplication sharedApplication] statusBarOrientation]];

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


Here are the warnings I see:

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.


All posts I have found about restrictions assume a constructor interface is being used.

Any hints? Thank!

Just in case anyone finds this post looking for information about rotation: I noticed something odd about how on iOS8 MPMoviePlayerController

it seems to automatically rotate to the correct orientation and if I leave the updateOrientationWithOrientation

as-is method (see the GitHub link) , then it appears 90 degrees depending on what is required. So on iOS8 I detect the version inside updateOrientationWithOrientation and exit without any action on iOS8.


source to share

4 answers

OK, I eventually solved it by getting rid of the CCVideoPlayer extension extension that I was trying to hack and just use with MPMoviePlayerController

. When I get by with a Mac, I have to roll a new solution for this.

The key to getting rid of the message constraints was that the viewport in the window must be sized to match its size of superviews. To do this, I built a UIView in code with the correct size and position and made an MPMoviePlayerController to view this child.

Here's some of that code:

_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 frame size must match parent's

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


a more detailed approach paste is shown at this value . I based my approach on the ideas presented in on this other answer .



I had the same constraint issues. However, sez's answer didn't work for me, so I dug a little deeper. In my case, the problem was the call [videoConroller prepareToPlay]

before setting the video controller view frame and adding it to the supervisor.

I was instantiating my MPMoviePlayerController and calling prepareToPlay on viewDidLoad since I had a URL at the time. However, I was waiting for viewDidAppear to actually determine the size of the video player and add it to the view hierarchy.

Simply moving this method by calling after adding the view to the hierarchy solved my problem. Also, I was able to create a frame that did not match the bounds of the parent view.



Have you tried using MPMoviePlayerViewController instead of MPMoviePlayerController? (I'm fine :-)) Then set translatesAutoresizingMaskIntoConstraints to YES. Similar:

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


I hope this is helpful to you! ..



In iOS 9.1.2, below strings are allowed. Also the warning repeats until I restart the application. These lines solved it.

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




All Articles