私は、画像のパン、スケーリング、回転などの機能を持つアプリに取り組んでいます。最初に、画像の UIImageView に適用されるすべてのジェスチャ認識を実装しましたが、実際の画像が同じままであることに気付き、変更する必要がありました。
この種の問題を扱う SO に関する質問 -回転した UIImageView から UIImage を作成する- を見つけ、実際に Magic Bullet Dave が提供したコードを使用することができました。ただし、私のアプリは画像の回転だけでなくスケーリングもサポートするはずなので、変更する必要がありました。彼は基本的に、回転した画像が収まる CGRect を返すメソッドを作成しました。問題は、スケーリングされた画像を適切に囲むために CGRect をスケーリングできないことです。アプリで画像を回転させ (シミュレーターで実行)、テスト目的で保存された png バージョンを観察すると、CGRect は画像の上隅と下隅をクリップします。画像が 90 度回転するほど、それは切り取られます。
これは、CGRect を返すメソッドです。
- (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);
// Create the new rectangle
CGRect rotatedRect = CGRectMake(newX, newY, newWidth, newHeight);
return CGRectApplyAffineTransform(rotatedRect, CGAffineTransformScale(originalState, theScale, theScale));
}
ご覧のとおり、回転した画像の CGRect を取得してスケーリングしようとしましたが、役に立ちませんでした。次に、実際のイメージの作成に使用されます。
CGFloat angle = totalAngle;
UIImage *viewImage;
// Get image width, height of the bounding rectangle
CGRect boundingRect = [self getBoundingRectAfterRotation: self.photoView.bounds byAngle:angle];
// Create a graphics context the size of the bounding rectangle
UIGraphicsBeginImageContext(boundingRect.size);
CGContextRef context = UIGraphicsGetCurrentContext();
// Rotate and translate the context
CGAffineTransform transform = CGAffineTransformIdentity;
transform = CGAffineTransformTranslate(transform, boundingRect.size.width/2, boundingRect.size.height/2);
transform = CGAffineTransformRotate(transform, angle);
transform = CGAffineTransformScale(transform, theScale, -theScale);
CGContextConcatCTM(context, transform);
これは明らかに完了していないため、コードはまだクリーンアップされていません。現在、CGRect を必要以上に大きくすることで回避策を作成しましたが、もちろんこれは避けたいと考えています。
どんな助けでも大歓迎です。