0

そこにある画像を使って、ユーザーが自分のステージをデザインできるアプリを作成しています。ボタンを画像として作成しましたが、特定の画像ビュー領域でユーザーが画像 (ボタン) をドラッグ アンド ドロップできるようにするコードが必要です。

4

1 に答える 1

0

これはタップ ジェスチャで実現できますが (たとえば、最初の画像ビューをタップし、目的の画像ビューをタップします)、あまり直感的ではありません。UIPanGestureRecognizer を使用して適切なドラッグ アンド ドロップを行うと、エンド ユーザーにとってはるかに直感的になります。

技術的には、画像ビューから画像をドラッグするのではなく、実際に画像ビュー自体をドラッグします。(画像自体には、画像ビューがなければ視覚的な表現はありません。) そして手を離すと、画像ビュー フレームの変化をアニメートして錯覚を完成させます。

imageViews の NSArray がある場合、スーパービューにジェスチャを追加できます。

@property (nonatomic, strong) NSMutableArray *imageViews;

- (void)viewDidLoad
{
[super viewDidLoad];

[self createImageViewArray];

UIPanGestureRecognizer *gesture = [[UIPanGestureRecognizer alloc] initWithTarget:self                                                                          action:@selector(handlePan:)];
[self.view addGestureRecognizer:gesture];
}

- (void)createImageViewArray
{
self.imageViews = [NSMutableArray array];
}

- (void)handlePan:(UIPanGestureRecognizer *)gesture
{
static UIImageView *draggedImage = nil;
static CGRect draggedImageOriginalFrame;

CGPoint location = [gesture locationInView:gesture.view];

if (gesture.state == UIGestureRecognizerStateBegan)
{

    draggedImage = [self determineImageForLocation:location];

    if (draggedImage)
    {
        draggedImageOriginalFrame = draggedImage.frame;
        [draggedImage.superview bringSubviewToFront:draggedImage];
    }
}
else if (gesture.state == UIGestureRecognizerStateChanged && draggedImage != nil)
{

    CGPoint translation = [gesture translationInView:gesture.view];
    CGRect frame = draggedImageOriginalFrame;
    frame.origin.x += translation.x;
    frame.origin.y += translation.y;
    draggedImage.frame = frame;
}
else if (draggedImage != nil && (gesture.state == UIGestureRecognizerStateEnded ||
                                 gesture.state == UIGestureRecognizerStateCancelled ||
                                 gesture.state == UIGestureRecognizerStateFailed))
{

    UIImageView *droppedOver = nil;

    if (gesture.state == UIGestureRecognizerStateEnded)
        droppedOver = [self draggedImageView:draggedImage toLocation:location];

    if (droppedOver == nil)
    {
        [UIView animateWithDuration:0.25
                         animations:^{
                             draggedImage.frame = draggedImageOriginalFrame;
                         }];
    }
    else
    {
        [droppedOver.superview bringSubviewToFront:droppedOver];

        [UIView animateWithDuration:0.25
                         animations:^{
                             draggedImage.frame = droppedOver.frame;
                             droppedOver.frame = draggedImageOriginalFrame;
                         }];
    }
  }
 }

- (UIImageView *)draggedImageView:(UIImageView *)draggedView toLocation:(CGPoint)location
{
   for (UIImageView *imageview in self.imageViews)
     if (CGRectContainsPoint(imageview.frame, location) && imageview != draggedView)
        return imageview;

 return nil;
}
- (UIImageView *)determineImageForLocation:(CGPoint)location
{
 return [self draggedImageView:nil toLocation:location];
}
于 2013-07-24T07:20:46.930 に答える