2017-09-05 7 views
0

J'ai deux vues, videoView (qui est la mainView) et subVideoView (qui est la sous-vue de mainView). J'essaie de minimiser les deux vues en utilisant l'animation en même temps, comme indiqué dans le code ci-dessous. Je suis capable de minimiser le videoView (i.e mainView) et pas le subVideoView.Impossible de minimiser la sous-vue aux côtés de mainView pendant l'animation

Cependant, lorsque je cache du code pour minimiser videoView (c'est-à-dire mainView), je suis capable de minimiser le sous-vidéo. Je crois qu'il doit faire quelque chose avec la façon dont je suis en train d'animer.

Quelqu'un peut-il s'il vous plaît conseiller comment je peux réduire les deux vues (proportionnellement) avec animation en même temps et finir avec le résultat ci-dessous.

enter image description here

RÉSULTATS DE EXISTANT enter image description here

func minimiseOrMaximiseViews(animationType: String){ 


     UIView.animate(withDuration: 0.5, delay: 0, options: [], 

      animations: { [unowned self] in 
       switch animationType { 
       case "minimiseView" : 

        // Minimising subVideoView 

        self.subVideoView.frame = CGRect(x:  self.mainScreenWidth - self.minSubVideoViewWidth - self.padding, 
                 y:  self.mainScreenHeight - self.minSubVideoViewHeight - self.padding, 
                 width: self.minSubVideoViewWidth, 
                 height: self.minSubVideoViewHeight) 

        // Minimising self i.e videoView 

        self.frame = CGRect(x:  self.mainScreenWidth - self.videoViewWidth - self.padding, 
             y:  self.mainScreenHeight - self.videoViewHeight - self.padding, 
             width: self.videoViewWidth, 
             height: self.videoViewHeight) 

        self.layoutIfNeeded() 

       case "maximiseView": 

        // Maximising videoView 

        self.frame = CGRect(x: 0, y: 0, width: self.mainScreenSize.width, height: self.mainScreenSize.height) 

        // Maximising subVideoView 

        self.subVideoView.frame = CGRect(x:  self.mainScreenWidth - self.maxSubVideoViewWidth - self.padding, 
                 y:  self.mainScreenHeight - self.maxSubVideoViewHeight - self.padding - self.buttonStackViewBottomPadding - buttonStackViewHeight, 
                 width: self.maxSubVideoViewWidth, 
                 height: self.maxSubVideoViewHeight) 
       default: 
        break 
} 

Répondre

0

Selon vos besoins ajouter subviews dans MainView et mis

mainView.clipsToBounds = true 

et Dans la méthode minimiseOrMaximiseViews vous avez juste besoin de gérer Y axe de mainView pour afficher et masquer.

+0

Je voudrais minimiser la vue, c'est-à-dire réduire la taille de la vue. Je ne veux pas clipsToBounds car il ne fait que clipser et ne réduit pas la taille de la vue. – user44776

+0

@moritz, a ajouté des images détaillées pour mieux expliquer le problème – user44776

0

Je pourrais minimiser les deux vues simultanément en utilisant l'animation, quand j'ai défini les deux vues (videoView et subVideoView) comme sous-vues de la fenêtre i.e UIApplication.shared.keywindow.

0

À moins que je ne manque quelque chose, ce type d'animation est beaucoup plus facilement réalisé en animant la propriété transform du videoView (la vue principale). Vous devrez concaténer les transformations de mise à l'échelle et de traduction pour cela, car la mise à l'échelle est par défaut appliquée au centre d'une vue.

L'astuce est que l'application d'une transformation à une vue affecte automatiquement toutes ses sous-vues, par ex. l'application d'une transformation d'échelle à une vue met à l'échelle la vue et toutes ses sous-vues.

Pour créer une animation inverse, réglez simplement videoView.transform = CGAffineTransformIdentity dans un bloc d'animation.

Avertissement: Vous devez faire attention, cependant, avec la propriété frame d'une vue transformée. La propriété frame est synthétique et est dérivée de bounds, center et transform. Cela signifie que la définition frame d'une vue réinitialise sa propriété transform. En d'autres termes, si vous manipulez vos vues à l'aide de transform, vous souhaiterez probablement éviter de définir directement leurs images.