2010-10-15 13 views
12

Ho un UIView che ho impostato per rispondere ai gesti di pizzicamento e modificare le sue dimensioni, eccetto, una volta ingrandito e quindi provare a pizzicarlo di nuovo, salta alla sua dimensione originale (che per caso è 100x200). Ecco il codice:CGAffineTransformMakeScale Rende UIView salta alla dimensione originale prima della scala

@implementation ChartAxisView 


- (id)initWithFrame:(CGRect)frame { 
    if ((self = [super initWithFrame:frame])) { 
     // do gesture recognizers 
     UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(onPinch:)]; 
     [self addGestureRecognizer:pinch]; 
     [pinch release]; 
    } 
    return self; 
} 

- (void)drawRect:(CGRect)rect { 
    CGContextRef context = UIGraphicsGetCurrentContext(); 

    CGColorRef redColor = [UIColor colorWithRed:1.0 green:0.0 blue:0.0 alpha:1.0].CGColor; 

    CGContextSetFillColorWithColor(context, redColor); 
    CGContextFillRect(context, self.bounds); 
} 

- (void)onPinch: (UIPinchGestureRecognizer*) gesture { 
    self.transform = CGAffineTransformMakeScale(gesture.scale, gesture.scale); 
} 

- (void)dealloc { 
    [super dealloc]; 
} 


@end 

Qualche idea?

risposta

26

Quindi ci sono due tipi di scala (o, trasformare in generale) funzioni: CGAffineTransformMakeScale e CGAffineTransformScale

Il primo, CGAffineTransformMakeScale che si sta utilizzando, trasforma sempre rispetto alle dimensioni originali dell'immagine. Ed è per questo che vedi il salto alla sua dimensione originale prima che avvenga il ridimensionamento.

Il secondo, CGAffineTransformScale, si trasforma dalla posizione corrente dell'immagine. Questo è quello di cui hai bisogno. Per questo, richiede un ulteriore argomento 'transform'. L'argomento 'transform' nel tuo caso rappresenta l'immagine ingrandita.

Leggi this post di blog molto informativo sulle trasformazioni.

+0

Inoltre, il ridimensionamento automatico farà sì che i vincoli a interferire con la posizione, anche se viene utilizzato 'CAAffineTransformScale'. –

2
- (void)onPinch: (UIPinchGestureRecognizer*) gesture { 

    if ([gesture state] == UIGestureRecognizerStateBegan) 
    { 
    curTransform = self.transform; 
    } 

    self.transform = CGAffineTransformScale(curTransform,gesture.scale, gesture.scale); 
} 
  • uso CGAffineTransformScale invece di CGAffineTransformMakeScale
  • avrete bisogno di un membro -> CGAffineTransform curTransform;

;)

2

è possibile impostare trasformare con seguente codice:

ivClone setTransform:CGAffineTransformMakeScale(scale, scale)]; 

e si può ottenere corrente trasformare con i seguenti coee:

newV.transform.a //x scale 
newV.transform.d // y scale 
Problemi correlati