2013-08-20 14 views
11

Ho passato molto tempo a cercare un modo per utilizzare CGAffineScale per trasformare una vista in un determinato punto, compresi i punti di ancoraggio, spostando il centro di una vista prima e dopo la trasformazione e la ricerca completa su Google. Sono consapevole che sarebbe molto più semplice con un UIScrollview; ma so che è tecnicamente possibile fare a meno di uno, ed è diventato una scheggia nella mia mente.Come ridimensionare (zoomare) un UIView su un dato punto di riferimento CG

This answer si avvicina notevolmente a quello che voglio ottenere, ma la risposta fornisce solo dettagli su come ingrandire un determinato angolo (invece di un punto dato) spostando abilmente il centro nell'angolo opposto a quello che si desidera ingrandisci a.

Come è possibile modificare mvds' code per ridimensionare un UIView a qualsiasi punto specificato in un UIView?

CGFloat s = 3; 
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s); 
CGFloat h = self.view.frame.size.height; 
CGFloat w = self.view.frame.size.width; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    self.view.center = CGPointMake(w-w*s/2,h*s/2); 
} completion:^(BOOL finished) {}]; 

risposta

4

Ci sono 2 passaggi coinvolti: per prima cosa ridimensionare la vista che si desidera ingrandire. Quindi imposta il centro di questa vista ingrandita in modo che la parte che vuoi vedere finisca nel mezzo della vista.

Si dovrebbe disegnare questo su carta e le formule seguiranno: (non testato)

CGFloat s = 3; 
CGPoint p = CGPointMake(100, 200); 
CGAffineTransform tr = CGAffineTransformScale(self.view.transform, s, s); 
CGFloat h = self.view.frame.size.height; 
CGFloat w = self.view.frame.size.width; 
[UIView animateWithDuration:2.5 delay:0 options:0 animations:^{ 
    self.view.transform = tr; 
    CGFloat cx = w/2-s*(p.x-w/2); 
    CGFloat cy = h/2-s*(p.y-h/2); 
    self.view.center = CGPointMake(cx, cy); //was: (w*s/2,h-h*s/2); 
} completion:^(BOOL finished) {}]; 
+2

Grazie mille per la risposta. Ho provato questo, ma continua a zooma nel punto sbagliato. Ho provato a disegnare anche questo su carta, ma la logica mi sfugge. – glenstorey

2

Io in realtà sono imbattuto in questo stesso problema io stesso. Per risolvere il problema, tutto ciò che ho fatto è stato modificare il punto di ancoraggio della vista che stavo ridimensionando perché CGAffineTransforms viene eseguito sulla vista in relazione al suo punto di ancoraggio, quindi a seconda di dove si trova il punto di ancoraggio, la trasformazione verrà ridimensionata, traslata o ruotata la vista in modo diverso. Ecco l'idea di base:

CGPoint pointToScaleTo = CGPointMake(x, y); //Just enter the coordinates you 
              //want to scale your view towards 

CGFloat viewWidth = self.view.bounds.size.width; 
CGFloat viewHeight = self.view.bounds.size.height; 

CGFloat scaleFactorX = ...; 
CGFloat scaleFactorY = ...; 

CGAffineTransform scaleTransform = CGAffineTransformMakeScale(scaleFactorX, scaleFactorY); 

[UIView animateWithDuration:2.5f delay:0.0f options:0 animations:^{ 

    //I divide the x and y coordinates by the view width and height 
    //because the anchor point coordinates are normalized to the range 
    //0.0-1.0. 
    self.view.layer.anchorPoint = CGPointMake(pointToScaleTo.x/viewWidth, pointToScaleTo.y/viewHeight); 

    //Now that the anchor point has been changed, apply the scale transform 
    self.view.layer.transform = scaleTransform; 

} completion:^(BOOL finished) {}]; 
+1

Grazie per la risposta. A causa di iOS7 (credo) ho cambiato la linea CGAffineTransform in 'CATransform3D scaleTransform3D = CATransform3DMakeScale (scaleFactorX, scaleFactorY, 1.0);' (view.layer.transform doveva essere CATransform3D). Quello che succede ora è che la vista salta in modo che il 'pointToScaleTo' sia al centro (che non è l'ideale - idealmente vorrei zoomare verso il punto piuttosto che saltare a, quindi ingrandire) e quindi ruotare -90º. Non sono sicuro di dove sto ottenendo la rotazione. Sai come ottenere lo zoom al punto piuttosto che saltare e poi zoomare? – glenstorey

+0

È possibile convertire la trasformazione affine in un 'CATransform3D' usando' self.view.layer.transform = CATransform3DMakeAffineTransform (scaleTransform); '. – Dennis

Problemi correlati