0

私は現在、ユーザーが写真を撮ったり、ライブラリから選択したりするアプリケーションを持っています。

次のコントローラーでは、選択/撮影された画像が表示されます。

私が今やりたいことは、画像ビューの上にある種のビューを表示することです。ビューはエッジの周りが半透明になり、下の画像を示す円が表示されます (半透明ではありません)。基本的にこれは画像の一部を選択したものです。

次に、ユーザーがビューを移動できるようにする必要があるため、ビューが画面上のどこにあるかを保存する必要があります。

これにアプローチする最良の方法は何ですか?

移動できるオーバーレイ ビューが必要です。円は常に固定サイズで、内側は下の画像ビューを示し、外側は 0.5 の半透明になるため、画像は表示できますが、完全には表示されません。次に、移動した円の場所を保存しますか?

- - 編集 - - - ここに画像の説明を入力

これは私が作成したサンプル画像です。

UIImageView (最下層) として写真を持つビューがあります。この上に、ビューを追加しようとしています (上の図のように)。上の画像は、提案されているように実際には png であることに注意してください。ただし、このオーバーレイは移動可能です。円は透明 (0) であるため、下の写真が完全に見えます。外側 (灰色) は部分的に透明 (0.5) であるため、完全に見えないだけです。

上面図 (円の部分) を写真上で移動して、写真上の特定のポイントをマークします。この例では、円が画面上で側面 (灰色) が終了する場合、ビューの移動を考慮した巨大な画像を作成する必要があります。

EDIT 2 ---- photoView (別の UIImageView) の上に 1 つの UIImageView があります。オーバーレイは画面の 4 倍で、中央に円があります。

アイテムが移動すると、実行されるジェスチャ認識エンジンがあります。

-(void)handlePan:(UIPanGestureRecognizer *)gesture {
    NSLog(@"Pan Gesture");
    gesture.view.center = [gesture locationInView:self.view];
   }

現在、上から UIImageView は中点から移動しているため、指が動くと円が動いているように見えます。

それはすべて素晴らしいことですが、提案された回答を handlePan メソッドに実装するにはどうすればよいでしょうか。そのため、中間点がエッジに近すぎないことを確認する必要があります。理想的には、円が画面から完全に (またはほとんど) 外れないように、画面の周りに 50 のマージンが必要ですか?

4

2 に答える 2

1

最初に、中央に穴のあるこの移動フレームを簡単に処理できる png 画像を含む UIImageView を初期化します。これを画面に追加できます。これが完了したらtouchesBegantouchesMovedおよびその他の touch コマンドを使用して、ユーザーがそのボックスに触れているかどうかを確認し、そこからユーザーが前のポイントからどれだけ移動したかを判断します。この違いを使用して、画像の現在のフレームの原点または中心から値を加算または減算すると、ボックスが移動します。

編集

View.h で

CGPoint prevPoint;
float delX;
float delY;
UIView *overlayView;

In View.m

-(void) viewDidLoad {
    overlayView = [UIView alloc] initWithFrame:CGRectMake(100,100,100,100)];
    [overlayView setBackgroundColor:[UIColor clearColor]];
    [self.view addSubview:overlayView];
    UIImageView *circImage = [[UIImageView alloc] initWithFrame:CGRectMake(0,0,overlayView.frame.width,overlayView.frame.height)];
    [circImage setImage:[UIImage imageNamed:@"SomeImage.png"]];
    [overlayView addSubview:circImage];
    [self.view setNeedsDisplay];
}

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    prevPoint = [touch locationInView:overlayView];
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint new = [touch locationInView:overlayView];
    delX = new.x - prevPoint.x;
    delY = new.y - prevPoint.y;
    CGRect overFrame = overlayView.frame;
    overFrame.x += delX;
    overFrame.y += delY;
    [overlayView setFrame:overFrame];
    [self.view setNeedsDisplay];
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    UITouch *touch = [touches anyObject];
    CGPoint new = [touch locationInView:overlayView];
    delX = new.x - prevPoint.x;
    delY = new.y - prevPoint.y;
    CGRect overFrame = overlayView.frame;
    overFrame.x += delX;
    overFrame.y += delY;
    [overlayView setFrame:overFrame];
    [self.view setNeedsDisplay];
}
于 2013-07-15T20:55:39.730 に答える