2017-06-17 3 views
0

Je souhaite convertir un rectangle d'une autre vue de collection (cellContentCollectionView) en un rectangle égal dans mon contrôleur de vue racine.Utilisation de la méthode convert (_: to :) dans swift

La méthode d'instance utilisée pour ce faire est convert (_: to :), mais j'ai du mal à définir le cadre de l'UIView dans le cadre des contrôleurs de vue racine.

Voici ce que j'ai jusqu'à présent ...

cellContentCollectionView?.convert((playerLayer?.frame)!, to: fullScreenPlayerView) 

cellContentCollectionView est le CollectionView qu'il est situé dans. Ce qui se trouve être dans un collectionViewCell.

Des suggestions?

+0

méthode de conversion retourne une nouvelle CGRect vous devez l'utiliser, 'laisser newFrame = cellContentCollectionView .convert? ((PlayerLayer .frame) !, à: fullScreenPlayerView)' –

+0

Quel est le point du second paramètre [à Vue: UIView?] Alors? Je suis un peu confus – Stefan

+0

est la vue de destination pour la conversion, la vue vous avez besoin de mettre votre rectangle, vous devez convertir 'playerLayer? .frame' de' cellContentCollectionView' en système de coordonnées 'fullScreenPlayerView' –

Répondre

0

Vous n'avez pas expliquer la relation exacte entre cellContentCollectionView et playerLayer, donc je vais supposer le pire: que playerLayer n'est pas une sous-vue de cellContentCollectionView.

Je soupçonne également que playerLayer n'est pas réellement une vue du tout, mais est un CALayer. C'est bon, parce que sur iOS, frame d'une vue est toujours layer.frame, donc nous pouvons simplement gérer les calques.

Le frame d'une couche est dans la géométrie de sa super-couche. Vous devez donc demander à son supercalculateur de convertir son frame. Mais, si la couche n'est pas transformée, vous pouvez à la place demander à la couche de convertir son propre bounds à la place.

Si vous souhaitez utiliser le rectangle résultant en tant qu'image d'un calque cible, vous devez effectuer la conversion en super couche du calque cible. Vous ne pouvez pas simplement convertir la géométrie de la couche cible et définir le bounds du calque cible, car cela ne met pas à jour le position du calque cible.

Ainsi je pense que vous voulez écrire ceci:

if 
    let playerLayer = playerLayer, 
    let fullScreenPlayerSuper = fullScreenPlayerView.layer.superlayer 
{ 
    let frame = playerLayer.convert(playerLayer.bounds, to: fullScreenPlayerSuper) 
    fullScreenPlayerView.frame = frame 
} 
+0

Cela ne produit pas d'erreurs, cependant le cadre produit par ce code est 0,0,0,0 – Stefan

+0

'print (playerLayer.bounds)' Quelle est la sortie? –

+0

Aussi playerLayer est un AVPlayerLayer qui se trouve au-dessus d'un AVPlayer et UIView – Stefan

0

Voici comment je le ferais, en supposant que playerLayer est un UIView.

guard let playerLayer = playerLayer, superview = playerLayer.superview else { return } 

fullScreenPlayerView.convert(playerLayer.frame, from: superview) 
+0

playerLayer est un AVPlayerLayer la raison pour laquelle je l'ai référencé était parce que je vais avoir besoin de sa sortie visuelle de toute façon. Cependant, il est masqué à un UIView donc j'essaierai d'utiliser le UIView avec votre code – Stefan

+0

Votre code ne produit rien. C'est comme si ça produisait zéro, mais ça ne le dit pas. – Stefan