2012-01-15 7 views
0

私のプロジェクトを説明するには:CGRectまたはCGImageCreateWithImageInRectをどのように回転させるのですか?

私は白いレイヤーの上に浮かぶ矩形のUIImageViewフレームを持っています。 UIImageViewの中で、私は白いレイヤーの背後に背景画像の一部を表示しているという錯覚を作り出しています。矩形をドラッグすると、画像を「再描画」して、白いものの後ろにあるものを覗くことができます。その基本的にこのコードは:

//whenever the frame is moved, updated the CGRect frameRect and run this: 

self.newCroppedImage = CGImageCreateWithImageInRect([bgImage.image CGImage], frameRect); 
frame.image = [UIImage imageWithCGImage:self.newCroppedImage]; 

とにかく、私はまた、ユーザがフレームを回転させることができ(及び結果的に画像を回転させる)回転ジェスチャ認識を持っています。これは、CGImageCreateWithImageInRectに送信されたCGRectが、元の回転方向に向いているためです。これは、フレームのみがそのように表示されるときに、表示されるイメージが回転するため、ウィンドウを見ているという錯覚を壊します。

理想的には、フレームの回転を取り、それをbgImageから作成したイメージに適用する必要があります。私はこれをどのように適用できるかについての手がかりやアイデアは誰にもありますか?

答えて

4

私は別のアプローチをとることをお勧めします。 UIImageViewに入れるために常に新しい画像を作成しないでください。代わりに、次のようにビュー階層を設定します。

White view 
    "Hole" view (just a regular UIView) 
     Image view 

つまり、ホワイトビューでは、サブビューとしてホールビューが使用されます。ホールビューのサブビューはUIImageViewです。

ホールビューでは、clipsToBoundsプロパティをYESに設定する必要があります(コードまたはペン先で設定できます)。

イメージビューのサイズはイメージのサイズに設定する必要があります。これは、もちろん、穴の大きさよりも大きくなります。

これは非常に重要です。画像ビューの中心を穴の中心に設定する必要があります。

私のテストプロジェクトで設定したコードは次のとおりです。白い画像はself.viewです。私は白いビューの中心にある穴から始め、穴のビューの中心にイメージビューの中心を設定します。

- (void)viewWillAppear:(BOOL)animated 
{ 
    [super viewWillAppear:YES]; 

    CGRect bounds = self.view.bounds; 
    self.holeView.center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); 
    self.holeView.clipsToBounds = YES; 

    bounds = self.holeView.bounds; 
    self.imageView.center = CGPointMake(CGRectGetMidX(bounds), CGRectGetMidY(bounds)); 
    self.imageView.bounds = (CGRect){ CGPointZero, self.imageView.image.size }; 

} 

また、画像ビューのサイズを画像のサイズに設定しました。白いビューのサイズに設定するとよいでしょう。

穴をパンして回転するには、holeView.transformと設定します。 holeView.frameまたはholeView.centerを変更するつもりはありません。私は変換を計算するために使用する2つのインスタンス変数、_holeOffset_holeRotationを持っています。画像ビューを明らかに、それは白いビューに穴のように見える作りにトリックは、は穴ビューの変換の効果を取り消し、画像表示に変換を適用することです:

- (void)updateTransforms { 
    CGAffineTransform holeTransform = CGAffineTransformIdentity; 
    holeTransform = CGAffineTransformTranslate(holeTransform, _holeOffset.x, _holeOffset.y); 
    holeTransform = CGAffineTransformRotate(holeTransform, _holeRotation); 
    self.holeView.transform = holeTransform; 
    self.imageView.transform = CGAffineTransformInvert(holeTransform); 
} 

このトリックサブビューの逆変換を使用するのは、サブビューの中心がスーパービューの中心にある場合にのみ機能します。 (技術的には、アンカーポイントは整列する必要がありますが、デフォルトではビューのアンカーポイントが中心です)

holeViewUIPanGestureRecognizerを入れます。私は私のビューコントローラにpanGesture:を送信するように構成:

- (IBAction)panGesture:(UIPanGestureRecognizer *)sender { 
    CGPoint offset = [sender translationInView:self.view]; 
    [sender setTranslation:CGPointZero inView:self.view]; 
    _holeOffset.x += offset.x; 
    _holeOffset.y += offset.y; 
    [self updateTransforms]; 
} 

私もholeViewUIRotationGestureRecognizerを置きます。私はrotationGesture:を私のView Controllerに送るように設定しました:

- (IBAction)rotationGesture:(UIRotationGestureRecognizer *)sender { 
    _holeRotation += sender.rotation; 
    sender.rotation = 0; 
    [self updateTransforms]; 
} 
+0

ありがとう、このコードは素晴らしいです。私はxcodeで作業しています。私はまだそれを完全に消化していませんが、私がどこにいるのかが分かりません。 – user339946

関連する問題