2011-08-25 8 views
7

È possibile ruotare solo l'immagine in UIImageView? Sto cercando informazioni a riguardo, ma ho trovato solo informazioni su come ruotare UIImageVeiw.Ruota immagine in UIImageView

risposta

15

È possibile ruotare l'immagine con il seguente codice. Nota, questo utilizza una CGImageRef che si può ottenere da un UIImage tramite

CGImageRef imageRef = [self CGImageRotatedByAngle:[image CGImage] angle:30]; 

Una volta che l'immagine ruotata, è possibile impostare l'immagine del ImageView alla vostra nuova immagine ruotata in questo modo:

UIImage* img = [UIImage imageWithCGImage: imageRef]; 
myImageView.image = img; 

qui è un metodo che ruota l'imageRef:

- (CGImageRef)CGImageRotatedByAngle:(CGImageRef)imgRef angle:(CGFloat)angle 
{ 

    CGFloat angleInRadians = angle * (M_PI/180); 
    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat height = CGImageGetHeight(imgRef); 

    CGRect imgRect = CGRectMake(0, 0, width, height); 
    CGAffineTransform transform = CGAffineTransformMakeRotation(angleInRadians); 
    CGRect rotatedRect = CGRectApplyAffineTransform(imgRect, transform); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef bmContext = CGBitmapContextCreate(NULL, 
                rotatedRect.size.width, 
                rotatedRect.size.height, 
                8, 
                0, 
                colorSpace, 
                kCGImageAlphaPremultipliedFirst); 
    CGContextSetAllowsAntialiasing(bmContext, YES); 
    CGContextSetShouldAntialias(bmContext, YES); 
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationHigh); 
    CGColorSpaceRelease(colorSpace); 
    CGContextTranslateCTM(bmContext, 
          +(rotatedRect.size.width/2), 
          +(rotatedRect.size.height/2)); 
    CGContextRotateCTM(bmContext, angleInRadians); 
    CGContextTranslateCTM(bmContext, 
          -(rotatedRect.size.width/2), 
          -(rotatedRect.size.height/2)); 
    CGContextDrawImage(bmContext, CGRectMake(0, 0, 
              rotatedRect.size.width, 
              rotatedRect.size.height), 
         imgRef); 



    CGImageRef rotatedImage = CGBitmapContextCreateImage(bmContext); 
    CFRelease(bmContext); 
    [(id)rotatedImage autorelease]; 

    return rotatedImage; 
} 
+0

Grazie tu. È esattamente quello che voglio. – murzynpl

+1

Qualcuno potrebbe avere risultati imprevedibili come ho fatto di recente - l'immagine finale stava perdendo le dimensioni originali e gli angoli ritagliati. Quindi ho modificato leggermente la funzione per ottenere risultati corretti. Se qualcuno si sta chiedendo la mia soluzione è qui: http://stackoverflow.com/questions/19219855/uiimageview-get-transformed-uiimage/19221081#19221081 – heximal

+0

Dopo la rotazione la dimensione dell'immagine cambierà come menzionato il commentatore precedente. C'è un piccolo bug nel codice sopra. L'ultima chiamata a CGContextTranslateCTM e CGContextDrawImage deve utilizzare larghezza e altezza originali anziché arrotondatoRect.size.width e rounded.size.height. Una volta che lo fai, questo codice sopra funziona perfettamente. Motivo: viene creato un ctxt con rotazione ruotata, l'origine spostata al centro, quindi viene ruotata inversamente per adattarsi all'orientamento dell'immagine originale. A questo punto è necessario spostarlo nuovamente nel sistema di coordinate dell'immagine originale. – matangs

6

Dai un'occhiata alla rotazione del livello di ImageView. Dovrai importare la libreria QuartzCore per renderla accessibile.

myImageView.layer.transform = CGAffineTransformMakeRotation (1.5); 
+1

dovuto usare 'setAffineTransform' – fabian789

5

si prega di provare questo, per me funziona:

[UIView beginAnimations:nil context:nil]; 
[UIView setAnimationBeginsFromCurrentState:YES]; 
[UIView setAnimationCurve:UIViewAnimationCurveEaseIn]; 
[UIView setAnimationRepeatCount:10]; 
myImgView.transform = CGAffineTransformMakeRotation(M_PI); 
[UIView commitAnimations]; 

Buona fortuna!

1

Il seguente codice funziona bene con Swift:

let img = UIImage(CGImage: self.imageView.image!.CGImage, scale: 1.0, orientation: UIImageOrientation.Right) 
self.imageView.image = img 
self.imageView.setNeedsLayout() 
0

Se è necessario ruotare/capovolgere un'immagine per scopi di localizzazione è possibile utilizzare il seguente: imageView.image = imageView.image?.imageFlippedForRightToLeftLayoutDirection()

Problemi correlati