拖动touchesBegan后创建的UIView

时间:2011-01-31 21:12:16

标签: objective-c cocoa-touch uitouch uiresponder

我有一些存在于一种库存中的UIView子类。当您点击一个时,另一个可拖动的版本放在它上面。我希望在您拖动其他人时保持库存版本。制作重复的代码但拖动手指不会移动它。

如果我发布然后开始拖动新创建的版本,它会按预期移动。我认为这是因为最初的触摸(使得欺骗)在响应者链中没有可拖动的版本。

一点点代码......

在我的固定“图标”中......

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    [self.viewController placeDraggableItem:self.item WithPoint:self.frame.origin];
}

在我的viewController中......

- (void)placeDraggableItem:(Item *)item WithPoint:(CGPoint)point
{
    DraggableItem *draggableItem = [[DraggableItem alloc] initWithImage:[UIImage imageNamed:item.graphic]];
draggableItem.frame = CGRectMake(point.x, scrollView.frame.origin.y + point.y, 64.0f, 64.0f);
    [self.view addSubview:draggableItem];   
    [draggableItem release];
}

在我的DraggableItem中......

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event
{
    currentPoint = [[touches anyObject] locationInView:self];
}

- (void) touchesMoved:(NSSet*)touches withEvent:(UIEvent*)event
{
    CGPoint activePoint = [[touches anyObject] locationInView:self];
    CGPoint newPoint = CGPointMake(self.center.x + (activePoint.x - currentPoint.x), self.center.y + (activePoint.y - currentPoint.y));

    float midPointX = CGRectGetMidX(self.bounds);
    if (newPoint.x > self.superview.bounds.size.width  - midPointX)
        newPoint.x = self.superview.bounds.size.width - midPointX;
    else if (newPoint.x < midPointX)  // If too far left...
        newPoint.x = midPointX;

    float midPointY = CGRectGetMidY(self.bounds);
    if (newPoint.y > self.superview.bounds.size.height  - midPointY)
        newPoint.y = self.superview.bounds.size.height - midPointY;
    else if (newPoint.y < midPointY)  // If too far up...
        newPoint.y = midPointY;

    self.center = newPoint;
}

现在再次创建可拖动版本。首次发布第一次触摸后,可拖动的版本可以移动。但我认为我需要让新创建的UIView响应最初为“图标”制作的触摸。

有什么想法吗?

我知道这个问题有点类似于这个问题:How to "transfer" first responder from one UIView to another?但是在这种情况下应该接收触摸的视图已经存在,而我需要将触摸传递给新创建的视图。

1 个答案:

答案 0 :(得分:2)

我不知道有什么办法将触摸移到新创建的视图中,但这并不意味着没有办法实现它。看起来你真的只想要你的可拖动视图来处理触摸,我可能会创建每个可拖动的视图,同时你创建不可拖动的视图的alpha为0,并在touchesBegan中设置为1.如果你的非-draggable视图不需要处理触摸,然后让它们处理触摸只是为了传递它们是没有意义的。