2017-05-20 3 views
1

J'essaye de créer un visage redimensionnable avec UIPinchGestureRecognizer. Tous les tutoriels me disent toujours en ligne pour réinitialiser l'échelle 1, comme ce code:Qu'est-ce que l'échelle et pourquoi dois-je la réinitialiser lors de l'utilisation de UIPinchGestureRecognizer?

func changeScale(byReactingTo pinchRecognizer: UIPinchGestureRecognizer) 
{ 
    switch pinchRecognizer.state { 
    case .changed,.ended: 
     scale *= pinchRecognizer.scale 
     pinchRecognizer.scale = 1 
    default: 
     break 
    } 
} 

où l'échelle est un CGFloat qui est liée à la taille du visage.

Cependant, je n'ai pas trouvé d'explication raisonnable quant à pourquoi pinchRocgnizer.scale doit toujours être remis à 1 après que l'utilisateur pince. Je comprends que la suppression pourrait causer un comportement erratique, mais pourquoi?

+0

https://developer.apple.com/reference/uikit/uipinchgesturerecognizer/1622235-scale vous pouvez lire la documentation. Ce n'est pas la valeur delta donc vous ne devriez pas concaténer. –

+0

@ user2215977 Mais la documentation n'explique pas pourquoi pinchRecognizer.scale doit être réinitialisé à chaque fois. –

Répondre

0

La documentation a indiqué que le scale de UIPinchGestureRecognizer est calculé à partir du début de la reconnaissance gestuelle. Dans votre code scale *= pinchRecognizer.scale, concaténer la valeur de scale dans chaque invocation pendant le geste.

Si la valeur de scale est 1.1, 1.2 alors votre scale *= pinchRecognizer.scale après la deuxième invocation serait erroné comme 1.32 pas 1.2. Donc, si vous changez votre code à scale = pinchRecognizer.scale, vous n'avez pas besoin de réinitialiser scale de UIPinchGestureRecognizer à zero.

Je suppose que la mise en œuvre interne de UIPinchGestureRecognizer utilise la valeur scale de garder une trace de la scale relative du UIView au moment où le geste d'être reconnu. Donc, si vous le réinitialisez à zero, cela signifie que le scale est relatif à l'invocation perméable au lieu du premier appel.