私は別のアプローチをとることをお勧めします。 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);
}
このトリックサブビューの逆変換を使用するのは、サブビューの中心がスーパービューの中心にある場合にのみ機能します。 (技術的には、アンカーポイントは整列する必要がありますが、デフォルトではビューのアンカーポイントが中心です)
holeView
にUIPanGestureRecognizer
を入れます。私は私のビューコントローラに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];
}
私もholeView
にUIRotationGestureRecognizer
を置きます。私はrotationGesture:
を私のView Controllerに送るように設定しました:
- (IBAction)rotationGesture:(UIRotationGestureRecognizer *)sender {
_holeRotation += sender.rotation;
sender.rotation = 0;
[self updateTransforms];
}
ありがとう、このコードは素晴らしいです。私はxcodeで作業しています。私はまだそれを完全に消化していませんが、私がどこにいるのかが分かりません。 – user339946