2017-11-10 24 views
0

UIImageView의 이미지를 여러 번 회전하는 버튼을 만들려고합니다. 그런 다음 외부 API로 보내야합니다. 나는 두 가지 옵션Objective-C - 이미지의 비율을 잃지 않고 이미지를 UIImageView 내에서 회전

에게 옵션 1 시도가

Image after rotatation Image before rotation

비율 (같은 이미지)에 느슨하게 할 필요가 없습니다 : 나는 비율을

(UIImage *)imageRotatedByDegrees:(UIImage*)oldImage deg:(CGFloat)degrees 
{ 
    // calculate the size of the rotated view's containing box for our drawing space 
    UIView *rotatedViewBox = [[UIView alloc]  initWithFrame:CGRectMake(0,0,oldImage.size.width, oldImage.size.height)]; 
    CGAffineTransform t = CGAffineTransformMakeRotation(degrees * M_PI/180); 
    rotatedViewBox.transform = t; 
    CGSize rotatedSize = rotatedViewBox.frame.size; 
    // Create the bitmap context 
    UIGraphicsBeginImageContext(rotatedSize); 
    CGContextRef bitmap = UIGraphicsGetCurrentContext(); 

    // Move the origin to the middle of the image so we will rotate and scale around the center. 
    CGContextTranslateCTM(bitmap, rotatedSize.width/2, rotatedSize.height/2); 

    // // Rotate the image context 
    CGContextRotateCTM(bitmap, (degrees * M_PI/180)); 

    // Now, draw the rotated/scaled image into the context 
    CGContextScaleCTM(bitmap, 1.0, -1.0); 
    CGContextDrawImage(bitmap, CGRectMake(-oldImage.size.width/2, -oldImage.size.height/2, oldImage.size.width, oldImage.size.height), [oldImage CGImage]); 

    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    return newImage; 
} 

옵션 2를 풀어 :

(UIImage*)upsideDownBunny:(CGFloat)radians withImage:(UIImage*)testImage { 

    __block CGImageRef cgImg; 
    __block CGSize imgSize; 
    __block UIImageOrientation orientation; 
    dispatch_block_t createStartImgBlock = ^(void) { 
     // UIImages should only be accessed from the main thread 

     UIImage *img =testImage; 
     imgSize = [img size]; // this size will be pre rotated 
     orientation = [img imageOrientation]; 
     cgImg = CGImageRetain([img CGImage]); // this data is not rotated 
    }; 
    if([NSThread isMainThread]) { 
     createStartImgBlock(); 
    } else { 
     dispatch_sync(dispatch_get_main_queue(), createStartImgBlock); 
    } 
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB(); 
    // in iOS4+ you can let the context allocate memory by passing NULL 
    CGContextRef context = CGBitmapContextCreate(NULL, 
               imgSize.width, 
               imgSize.height, 
               8, 
               imgSize.width * 4, 
               colorspace, 
               kCGImageAlphaPremultipliedLast); 
    // rotate so the image respects the original UIImage's orientation 
    switch (orientation) { 
     case UIImageOrientationDown: 
      CGContextTranslateCTM(context, imgSize.width, imgSize.height); 
      CGContextRotateCTM(context, -radians); 
      break; 
     case UIImageOrientationLeft: 
      CGContextTranslateCTM(context, 0.0, imgSize.height); 
      CGContextRotateCTM(context, 3.0 * -radians/2.0); 
      break; 
     case UIImageOrientationRight: 
      CGContextTranslateCTM(context,imgSize.width, 0.0); 
      CGContextRotateCTM(context, -radians/2.0); 
      break; 
     default: 
      // there are mirrored modes possible 
      // but they aren't generated by the iPhone's camera 
      break; 
    } 
    // rotate the image upside down 

    CGContextTranslateCTM(context, +(imgSize.width * 0.5f), +(imgSize.height * 0.5f)); 
    CGContextRotateCTM(context, -radians); 
    //CGContextDrawImage(context, CGRectMake(0.0, 0.0, imgSize.width, imgSize.height), cgImg); 
    CGContextDrawImage(context, (CGRect){.origin.x = -imgSize.width* 0.9f , .origin.y = -imgSize.width* 0.5f , .size.width = imgSize.width, .size.height = imgSize.width}, cgImg); 
    // grab the new rotated image 
    CGContextFlush(context); 
    CGImageRef newCgImg = CGBitmapContextCreateImage(context); 
    __block UIImage *newImage; 
    dispatch_block_t createRotatedImgBlock = ^(void) { 
     // UIImages should only be accessed from the main thread 
     newImage = [UIImage imageWithCGImage:newCgImg]; 
    }; 
    if([NSThread isMainThread]) { 
     createRotatedImgBlock(); 
    } else { 
     dispatch_sync(dispatch_get_main_queue(), createRotatedImgBlock); 
    } 
    CGColorSpaceRelease(colorspace); 
    CGImageRelease(newCgImg); 
    CGContextRelease(context); 
    return newImage; 
} 

이미지의 회전과 함께 잘 작동하지만 이미지를 회전 할 때마다보기가 축소됩니다.

누군가 나를 도울 수 있습니까?

+0

보기 [여기 (https://stackoverflow.com/questions/23615562/uiimageview-rotation-without-moving-image) – Kerberos

답변

0

회전을 애니메이션으로 만들려면 Core Animation을 사용할 수 있습니다. 이렇게하면 이미지 자체가 변경되지 않고 화면에서 회전 할 수 있습니다.

CABasicAnimation *animation = [CABasicAnimation animationWithKeyPath:@"transform.rotation.z"]; 
rotationAnimation.toValue = [NSNumber numberWithFloat:M_PI * 2.0]; 
rotationAnimation.duration = duration; 
rotationAnimation.cumulative = YES; 
rotationAnimation.repeatCount = numRotations; 
[self.imgviewRotate.layer addAnimation:animation forKey:@"animation"]; 
+0

I가 버튼을 가지고 있고, 그것을 장화 때 이미지를 회전한다. 사용자는 그가 원할 때마다 회전시킬 수 있습니다. imageview.image를 회전해야하지만 비율을 잃지 않아야합니다. – Jota

+0

내가 제안한대로보기를 회전 할 때의 문제점은 무엇입니까? – LGP

+0

죄송합니다, 결국 문제는 다른 곳에서 발생했습니다. 나는 항상 회전을 잘하고 있었다. – Jota