まったく同じ質問をブックマークしてください。
トリミング ビューを移動して画像の一部を正しく表示するところまでは行きましたが、スクロールビューのズームの処理は進行中の作業です。現在、UIScrollviewにレイヤー化されたイメージビューとプレーンUIViewがあり、スクロールビューの外側とより高いレベルには、カスタムトリミングUIViewがあります。touches メソッドを実装してドラッグを処理し、drawRect も実装します。
- (void)drawRect:(CGRect)rect {
// Drawing code
if( self.image == nil )
return;
CGPoint offset = scrollView.contentOffset;
clipRect = CGRectOffset(self.frame, offset.x, offset.y);
UIImage *croppedImage = [image croppedImage:clipRect];
CGContextRef ctx = UIGraphicsGetCurrentContext();
[croppedImage drawAtPoint:CGPointMake(0, 0)];
}
注: 私のトリミング ビューは UIImageView の子孫ではなく、他のビューからの基になる画像への参照を持つ単なる UIView です。
「croppedImage」は UIImage のカテゴリであり、非常に単純です。
@implementation UIImage (Resize)
- (UIImage *)croppedImage:(CGRect)bounds {
CGImageRef imageRef = CGImageCreateWithImageInRect([self CGImage], bounds);
UIImage *croppedImage = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return croppedImage;
}
...
@end
いくつかの UIScrollViewDelegate メソッドを実装し、スクロール アクティビティを通過させて、クロッピング ビューの同期を維持できるようにしました。ズームも引き継がれますが、前述のように、まだ期待どおりに機能していません。
別の注意: トリミングされた領域で毎回新しい UIImage を生成する時間を無駄にする必要はないと思います。
CGImageRef imageRef = CGImageCreateWithImageInRect([yourImage CGImage], bounds);
and
CGContextDrawImage(ctx, clipRect, imageRef);