iPhone App:在UIView中实现拖放图像

时间:2011-12-28 15:55:48

标签: iphone objective-c ios4 drag-and-drop

在我的iPhone应用程序中,我想实现如下所示的功能

enter image description here

用户可以从一个视图中选择一个形状(图像)并放入其他视图

我怎样才能做到这一点?

请帮助并建议。

感谢。

6 个答案:

答案 0 :(得分:6)

最简单的方法是使用UIPanGestureRecognizer。这将在移动视图和删除视图时为您提供消息。移动时,更新其中心。删除时,检查其位置是否在要放入的视图范围内。(您可能需要将坐标转换为目标视图的坐标系。)如果是,请执行相应的操作。

答案 1 :(得分:5)

答案 2 :(得分:2)

您可以参考上一篇文章,它肯定会帮助您实现此功能...

  1. Basic Drag and Drop in iOS
  2. Building drag and drop interface on iphone
  3. iPhone drag/drop
  4. 对于以上所有链接,您必须记住,您需要首先获得任何Control的TouchesBegin事件,然后您必须获得TouchesMoved事件以进行相同的控制。

    TouchesMoved事件中,您只需要获取Control的中心点(CGPoint)。当您释放时,控件将设置为CGPoint。如果这会产生问题,那么您可以在变量中使用CGPoint并在TouchesEnded事件中设置该点。

    对于您的情况,我认为您必须维护视图的层次结构 ...否则拖动视图时可能看不到...

    更多编码部分:

    -(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
    
            NSLog(@"%f,%f", self.center.x, self.center.y);
            CGPoint newLoc = CGPointZero;
    
            newLoc = [self.mainView convertPoint:[[touches anyObject] locationInView:self.superview] toView:self.superview];
            float newX = newLoc.x + self.superview.frame.origin.x + (self.frame.size.width /2) + [[touches anyObject] locationInView:self].x ;
            float newY = newLoc.y - (((UIScrollView *)self.superview).contentOffset.y *2) ;
            NSLog(@"content offset %f", ((UIScrollView *)self.superview).contentOffset.y);
    
            self.scrollParent.scrollEnabled = NO;
            NSLog(@"%f,%f", self.center.x, self.center.y);
    
            newLoc = CGPointMake(newX, newY);
            [self.superview touchesCancelled:touches withEvent:event];                                                               
            [self removeFromSuperview];
            NSLog(@"%f,%f", self.center.x, self.center.y);
    
    
            self.center = CGPointMake(newLoc.x, newLoc.y);
            [self.mainView addSubview:self];
            NSLog(@"%f,%f", self.center.x, self.center.y);
    
            [self.mainView bringSubviewToFront:self];
            isInScrollview = NO;
    }   
    
    -(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    
        [UIView beginAnimations:@"stalk" context:nil];
        [UIView setAnimationDuration:.001];
        [UIView setAnimationBeginsFromCurrentState:YES];
    
        UITouch *touch = [touches anyObject];
    
        self.center = [touch locationInView: self.superview];
    
        [UIView commitAnimations];
        if ((self.center.x + (self.frame.size.width / 2)) > 150 && hasExitedDrawer && !self.scrollParent.dragging ) {
            self.scrollParent.scrollEnabled = NO;
    
            [self.delegate moveItemsDownFromIndex: ((self.center.y + (self.scrollParent.contentOffset.y)) / 44) + 1 ];
            //NSLog(@"%i", ((self.center.y + (self.scrollParent.contentOffset.y *2)) / 44) + 1);
        }
    
        if (self.center.x + (self.frame.size.width / 2) < 150) {
    
            hasExitedDrawer = YES;
    
        }
    
    }   
    
    -(void) touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event {
    
        if ((self.center.x + (self.frame.size.width / 2)) > 150 && hasExitedDrawer && !self.scrollParent.dragging ) {
            CGPoint newLoc = CGPointZero;
    
            newLoc = [self.scrollParent convertPoint:[[touches anyObject] locationInView:self.superview] toView:self.superview];
            float newY = newLoc.y + (self.scrollParent.contentOffset.y *2);
    
            [self.scrollParent insertSubview:self atIndex:((self.center.y + (self.scrollParent.contentOffset.y)) / 44) ];
            self.frame = CGRectMake(0, newY, self.frame.size.width, self.frame.size.height);
            isInScrollview = YES;
            hasExitedDrawer = NO;
        }
    }
    

    这段代码可能包含一些无关紧要的内容,但会给你更多的想法...

答案 3 :(得分:1)

答案 4 :(得分:1)

Adding drag and drop component to iOS app问题

我想在Amazon,Flip kart等大多数购物应用中构建像添加到购物车之类的功能。

答案 5 :(得分:-2)

三步解决方案

1)你必须实施/听取触摸事件

2)实现拖动和触摸事件

3)然后管理movetosuperview方法。