Pracuję nad odtwarzaczem wideo z interfejsem AVPlayer API od AV Foundation w MonoTouch (ale rozwiązanie w obiektyw-c też może być miłe). Próbuję zaimplementować tryb pełnoekranowy.Pełny ekran: AVPlayerLayer nie zmienia rozmiaru podczas zmiany rozmiaru nadrzędnego widoku.
Aby wyświetlić klatki wideo, Mam UIView (nazwijmy go zobaczyć odtwarzanie), gdzie I dodaje AVPlayerLayer jako podrzędny warstwy widoku odtwarzania:
UIView *playbackView = ...
AVPlayerLayer *playerLayer = ...
[playbackView.layer addSublayer:playerLayer];
właściwości warstw są ustawione tak:
playerLayer.needsDisplayOnBoundsChange = YES;
playbackView.layer.needsDisplayOnBoundsChange = YES;
dla pewności, że zostaną one zmienione, jeśli zmieni się rozmiar widoku odtwarzania. Początkowo widok odtwarzania ma współrzędne (0, 0, 320, 180) (wyświetlane tylko w górnej części interfejsu użytkownika). Następnie wykonuję animację pełnoekranową, ustawiając rozmiar klatki odtwarzania jako rozmiar okna:
playbackView.frame = playbackView.window.bounds;
Działa dobrze. Widok odtwarzania wypełnia teraz całe okno (ustaw kolor tła, aby go zobaczyć). Ale moja AVPlayerLayer nadal pozostaje na górze widoku, tak jak poprzednio, w trybie innym niż tryb pełnoekranowy.
Dlaczego warstwa AVPlayer nie jest zmieniana zgodnie z nowym rozmiarem widoku odtwarzania? Czy muszę również zrobić animację na AVPlayerLayer? Odświeżenie za pomocą setNeedsLayout, layoutSubviews (wydaje się, że coś nie zmienia ...)? Usunąć AVPlayerLayer i dodać go ponownie?
Jednym z rozwiązań jest również rozmiar ramki warstwy według ramka odtwarzania podczas animacji (playerLayer.frame = playbackView.frame). Ale jeśli to zrobimy, warstwa nie będzie animowana, ale bezpośrednio wyświetlana z ostatecznym rozmiarem. Jak możemy animować również tę zmianę? Używaj animacji rdzenia zamiast animacji UIView? – nicolas