Вам нужно обратиться к двум вещам, чтобы сделать эту работу.
- Вы вращаетесь вокруг нижнего угла изображения вместо центра
- Ограничивающий прямоугольник получающегося изображения должен быть больше, теперь изображение поворачивается, чтобы оно поместилось.
Чтобы решить поворот вокруг центра, сначала выполните перевод в центр, затем поверните, а затем переведите обратно.
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformScale(transform, 1.0, -1.0);
CGContextConcatCTM(context, transform);
// Draw the image into the context
CGContextDrawImage(context, CGRectMake(-imageView.image.size.width/2, -imageView.image.size.height/2, imageView.image.size.width, imageView.image.size.height), imageView.image.CGImage);
// Get an image from the context
rotatedImage = [UIImage imageWithCGImage: CGBitmapContextCreateImage(context)];
Чтобы вычислить размер ограничивающего прямоугольника, вам нужно подогнать новое повернутое изображение, чтобы использовать это:
- (CGRect) getBoundingRectAfterRotation: (CGRect) rectangle byAngle: (CGFloat) angleOfRotation {
// Calculate the width and height of the bounding rectangle using basic trig
CGFloat newWidth = rectangle.size.width * fabs(cosf(angleOfRotation)) + rectangle.size.height * fabs(sinf(angleOfRotation));
CGFloat newHeight = rectangle.size.height * fabs(cosf(angleOfRotation)) + rectangle.size.width * fabs(sinf(angleOfRotation));
// Calculate the position of the origin
CGFloat newX = rectangle.origin.x + ((rectangle.size.width - newWidth) / 2);
CGFloat newY = rectangle.origin.y + ((rectangle.size.height - newHeight) / 2);
// Return the rectangle
return CGRectMake(newX, newY, newWidth, newHeight);
}
Вы можете найти эти методы в моих предыдущих постах и ответах здесь:
Создание UIImage из повернутого UIImageView
и здесь:
Сохранение 2 UIImages
Надеюсь, это поможет,
Dave