2017-02-20 2 views
0

J'implémente un zoom à pincement et la mise à l'échelle se produit dans le coin supérieur gauche de la vue par opposition au centre. Après quelques tentatives (cela ressemble à un problème d'origine cs ou similaire), ne pas trouver une bonne solution pour cela, mais il doit y avoir une certaine (peut-être évidente) façon d'échelle du centre de la vue. Si cela a déjà été répondu, apprécierait un pointeur vers la réponse (introuvable après une recherche approfondie). Si non, appréciera les entrées sur la bonne approche.Maintenir le zoom centré sur le centre UIView (par opposition à la mise à l'échelle du coin supérieur gauche)

Modifier les réponses suivantes (merci): Voici le code que j'utilisais d'abord:

func pinchDetected (pinchGestureRecognizer: UIPinchGestureRecognizer) {

let scale = pinchGestureRecognizer.scale 
    view.transform = CGAffineTransformScale(view.transform, scale, scale) 
    pinchGestureRecognizer.scale = 1.0 

}

Une fois pincée, le contenu à l'intérieur de la vue serait en expansion vers la droite et vers le bas, par opposition à la même chose + vers la gauche et vers le haut (d'où l'hypothèse qu'elle n'est pas mise à l'échelle "du centre"). J'espère que cela le rend plus clair.

+0

Pouvez-vous montrer votre implémentation actuelle pour qu'il soit possible de commenter cela? – naglerrr

+0

Fait @naglerrr - j'espère que cela clarifie. – aac

Répondre

0

C'est le code que vous recherchez

view.transform = CGAffineTransformScale(view.transform, 1.1, 1.1); 

ou à Swift

view.transform = view.transform.scaledBy(x: 1.1, y: 1.1) 

Cela augmentera la hauteur de vues et la largeur de l'échelle fournie. Vous pouvez maintenant contrôler le montant à l'aide d'un outil de reconnaissance de gestes.

+0

Merci - J'ai édité ma question pour inclure un extrait de code et c'était ce que j'utilisais déjà si je ne me trompe pas. Le résultat serait cependant que le contenu semble montrer le contenu en expansion à partir du coin supérieur gauche de la vue vers la droite et vers le bas. J'espère que cela clarifie et merci encore. – aac

0

Vous devriez pouvoir utiliser le code dans ce question pour l'agrandir du centre. Si vous voulez faire un zoom depuis les doigts, voir la réponse à cette question.

+0

Merci pour le pointeur - ajoutera un commentaire si une question à ce sujet mais j'espère que cela fournira la réponse. – aac

0

Il est difficile de savoir ce qui se passe sans voir votre code. Par défaut, les transformations agissent sur un centre de vues, ce qui semble être ce que vous voulez. Vous pouvez faire en sorte que les transformations agissent sur un autre point en modifiant la propriété anchorPoint sur la couche views.

Ou vous pouvez créer une transformation autour d'un point arbitraire en traduisant l'origine à ce point, en effectuant votre transformation et en traduisant à nouveau. par exemple:

func *(left: CGAffineTransform, right: CGAffineTransform) -> CGAffineTransform { 
    return left.concatenating(right) 
} 


public extension CGAffineTransform { 
    static func scale(_ scale:CGFloat, aboutPoint point:CGPoint) -> CGAffineTransform { 
     let Tminus = CGAffineTransform(translationX: -point.x, y: -point.y) 
     let S = CGAffineTransform(scaleX: scale, y: scale) 
     let Tplus = CGAffineTransform(translationX: point.x, y: point.y) 

     return Tminus * S * Tplus 
    } 
} 

view.transform = CGAffineTransform.scale(2.0, aboutPoint:point) 

où le point est relatif à l'origine, qui par défaut est le centre.

+0

J'ai vérifié votre code et pour moi ses échelles une vue sur son point central comme prévu. Donc je pense que le problème est ailleurs. Avez-vous vérifié que view.layer.anchorPoint est au centre? Il devrait être (0.5,0.5). Une autre possibilité est que vous ne modifiez pas la vue que vous pensez mettre à l'échelle. Peut-être que le coin supérieur de votre vue est le centre d'une vue d'ensemble que vous mettez à l'échelle? – DavidEC

+0

Ok merci - Je vais vérifier ces deux choses. – aac

+0

le point d'ancrage est défini correctement - c'est le cas que la vue est ajoutée à une vue d'ensemble qui reçoit les événements de pincement.Cependant, la fonction qui gère ces événements ne fait que mettre à l'échelle la vue enfant et cette vue enfant doit évoluer de manière indépendante non? – aac