È 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
È 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;
}
Dai un'occhiata alla rotazione del livello di ImageView. Dovrai importare la libreria QuartzCore per renderla accessibile.
myImageView.layer.transform = CGAffineTransformMakeRotation (1.5);
dovuto usare 'setAffineTransform' – fabian789
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!
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()
Se è necessario ruotare/capovolgere un'immagine per scopi di localizzazione è possibile utilizzare il seguente: imageView.image = imageView.image?.imageFlippedForRightToLeftLayoutDirection()
Grazie tu. È esattamente quello che voglio. – murzynpl
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
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