如何使用iPhone SDK仅拖动一个图像

时间:2011-01-29 14:22:42

标签: objective-c ios cocoa-touch

我想创建一个带有两个图像的小应用程序,我想只使图像覆盖可拖动。 经过研究,我找到了这个解决方案:

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {

    UITouch *touch = [[ event allTouches] anyObject];

    image.alpha = 0.7;

    if([touch view] == image){
        CGPoint location = [touch locationInView:self.view];
        image.center = location;
    }

它可以工作,但问题是图像可以从中心拖动,我不希望这样。 所以我找到了另一个解决方案:

- (void) touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event { 
    // Retrieve the touch point 
    CGPoint pt = [[touches anyObject] locationInView:self.view]; 
    startLocation = pt; 
    [[self view] bringSubviewToFront:self.view]; 

}


- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event { 
    // Move relative to the original touch point 

    CGPoint pt = [[touches anyObject] locationInView:self.view]; 
    frame = [self.view frame]; 
    frame.origin.x += pt.x - startLocation.x; 
    frame.origin.y += pt.y - startLocation.y; 
    [self.view setFrame:frame]; 
} 

效果很好但是当我添加另一个图像时,视图的所有图像都可以同时拖动。我是iPhone开发的初学者,我不知道如何才能使图像超出可拖动性。

3 个答案:

答案 0 :(得分:3)

您可以在if方法中使用touchesBegan:条件,请参阅此内容 -

-(void)ViewDidLoad
{
    //Your First Image View
    UIImageView *imageView1 = [UIImageView alloc]initWithFrame:CGRectMake(150.0, 100.0, 30.0, 30.0)];
    [imageView1 setImage:[UIImage imageNamed:@"anyImage.png"]];
    [imageView1 setUserInteractionEnabled:YES];
    [self.view addSubview:imageView1];

    //Your Second Image View
    UIImageView *imageView2 = [UIImageView alloc]initWithFrame:CGRectMake(150.0, 200.0, 30.0, 30.0)];
    [imageView2 setImage:[UIImage imageNamed:@"anyImage.png"]];
    [imageView2 setUserInteractionEnabled:YES];
    [self.view addSubview:imageView2];
}

//Now Use Touch begin methods with condition like this

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [[event allTouches]anyObject];
    if([touch view] == imageView1)
    {
        CGPoint pt = [[touches anyObject] locationInView:imageView1];
        startLocation = pt;
    }

    if([touch view] == imageView2)
    {
        CGPoint pt = [[touches anyObject] locationInView:imageView2];
        startLocation = pt;
    }
}

//Use same thing with touch move methods...
- (void) touchesMoved:(NSSet *)touches withEvent: (UIEvent *)event 
{
    UITouch *touch = [[event allTouches]anyObject];
    if([touch view] == imageView1)
    {
        CGPoint pt = [[touches anyObject] previousLocationInView:imageView1];
        CGFloat dx = pt.x - startLocation.x;
        CGFloat dy = pt.y - startLocation.y;
        CGPoint newCenter = CGPointMake(imageView1.center.x + dx, imageView1.center.y + dy);
        imageView1.center = newCenter;
    }

    if([touch view] == imageView2)
    {
        CGPoint pt = [[touches anyObject] previousLocationInView:imageView2];
        CGFloat dx = pt.x - startLocation.x;
        CGFloat dy = pt.y - startLocation.y;
        CGPoint newCenter = CGPointMake(imageView2.center.x + dx, imageView2.center.y + dy);
        imageView2.center = newCenter;
    }
}

只有当您触摸并移动它们时,这两个图像才会移动。我希望我的教程可以帮到你。

答案 1 :(得分:1)

只需使用这两种方法

-(void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event 
{
     UITouch *touch = [[event allTouches] anyObject];
     CGPoint location = [touch locationInView:touch.view];
     myImage.center = location;
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event 
{
    [self touchesBegan:touches withEvent:event];
}

答案 2 :(得分:0)

让我们分解吧。您应该在视图控制器中有一个主容器View(UIView的对象)。在其中,你应该有DragableImageView个对象。

DragableImageView继承UIImageView,然后在其中添加您的触摸代码。 (现在你正在做self.frame = position这是错误的 - 显然它会一次移动所有图像 - 因为如果我理解正确,你在视图控制器中添加这些触摸)。

首先创建DragableImageView,然后对其进行测试。然后添加两个DragableImageView个实例。在不同的配置中对它们进行测试..你可能想在containerView中进行测试以查看应该拖动哪个DragableImageView(例如,如果你有拼图,你可能想要选择那个回来而不是前面的一个)。