MPMoviePlayerController causando advertencias de restricción en Cocos2D

Estoy trabajando en un juego en Cocos2D para iOS y he visto muchas advertencias relacionadas con la restricción en la console. He leído muchas de las publicaciones relacionadas con restricciones aquí en SO y otros sitios, pero no he podido resolver esto.

No tengo files NIB y no he usado el generador de interfaces de usuario XCodes en este proyecto. Cocos2D solo usa una GLView de pantalla completa creada mediante progtwigción. Hasta donde puedo decir que todas estas restricciones provienen del MPMoviePlayerController que interactúa con la UIView en sí.

Estoy usando este código para la integración MPMoviePlayerController: https://github.com/cocos2d/cocos2d-iphone-extensions/blob/master/Extensions/CCVideoPlayer/iOS/CCVideoPlayerImpliOS.m

con algunos cambios leves para mostrar el video que no está en pantalla completa y para comstackrlo en iOS8:

- (void) setupViewAndPlay { UIWindow *keyWindow = [[UIApplication shanetworkingApplication] keyWindow]; CGSize viewSize = [[CCDirector shanetworkingDirector] 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 shanetworkingApplication] statusBarOrientation]]; // Movie playback is asynchronous, so this method returns immediately. [_theMovie play]; } 

Aquí están las advertencias que estoy viendo:

 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. 

Todas las publicaciones que he encontrado sobre restricciones asumen que el generador de interfaces se ha utilizado.

¿Alguna pista? ¡Gracias!


En caso de que alguien encuentre esta publicación en busca de información sobre la rotation: noté algo extraño en que en iOS8 el MPMoviePlayerController parece girar automáticamente a la orientación correcta y si dejo el método updateOrientationWithOrientation tal como está (ver el enlace GitHub) aparece a 90 grados de lo que se requiere. Entonces, en iOS8 detecté la versión dentro de updateOrientationWithOrientation y salgo sin hacer nada en iOS8.

Estaba teniendo los mismos problemas de restricciones. Sin embargo, la respuesta de sez no funcionó para mí, así que cavé un poco más profundo. En mi caso, el problema estaba llamando [videoConroller prepareToPlay] antes de configurar el marco de la vista del controller de video y agregarlo a una vista de supervisión.

Estaba creando la instancia de mi MPMoviePlayerController y llamaba prepareToPlay en viewDidLoad ya que tenía la url en este momento. Sin embargo, estaba esperando hasta viewDidAppear para realmente dimensionar el reproductor de video y agregarlo a la jerarquía de la vista.

Simplemente mover esa llamada a método después de agregar la vista a la jerarquía resolvió mi problema. Además, pude tener un marco que no coincidía con los límites de la vista principal.

¿Intentaste usar un MPMoviePlayerViewController en lugar de MPMoviePlayerController? (Funciona para mí :-)) A continuación, configure traduceAutoresizingMaskIntoConstraints a YES. Así como esto:

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

¡Espero que esto sea útil para ti!

OK, eventualmente resolví esto deshaciéndome de la extensión CCVideoPlayer que estaba tratando de hackear y simplemente usando directamente MPMoviePlayerController . Cuando me dedico a hacer Mac, tendré que lanzar una nueva solución para eso.

La key para deshacerse de los posts de restricción fue que el tamaño de la window de la vista de la película debe coincidir con el tamaño de las súper vistas. Para hacer esto, construí un UIView en código con el tamaño y la position correctos, e hice que la vista de MPMoviePlayerController fuera un hijo de eso.

Aquí hay una parte de ese código:

 _videoFrameView = [[UIView alloc] initWithFrame:frameUI]; [_videoFrameView setBackgroundColor:[UIColor networkingColor]]; [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]]; 

una pasta más detallada del enfoque se muestra en esta esencia . Basé mi enfoque en las ideas que se muestran en esta otra respuesta .

En iOS 9.1.2 se resuelven las líneas siguientes. Además, la advertencia se imprimió repetidamente hasta que reinicie la aplicación. Estas líneas lo resolvieron.

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