2013-05-10 36 views

回答

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]; 
} 
+0

给他upvote – 2014-08-21 08:50:20

相关问题