拖动 touchesBegan 后创建的 UIView

Posted

技术标签:

【中文标题】拖动 touchesBegan 后创建的 UIView【英文标题】:Dragging a UIView created after touchesBegan 【发布时间】:2011-01-31 21:12:15 【问题描述】:

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

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

一点代码...

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

- (void)touchesBegan:(NSSet*)touches withEvent:(UIEvent*)event

    [self.viewController placeDraggableItem:self.item WithPoint:self.frame.origin];

在我的视图控制器中...

- (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】:

我不知道有什么方法可以手动触发新创建的视图,但这并不意味着没有办法做到这一点。看起来你真的只希望你的可拖动视图来处理触摸,我可能会在创建不可拖动视图的同时创建每个 alpha 为 0 的可拖动视图,并在 touchesBegan 中将其设置为 1。如果你的非- 可拖动视图不需要处理触摸,那么让它们处理触摸只是为了传递它们是没有意义的。

【讨论】:

这实际上是一个很好的看待它的方法,可能比我正在做的更合乎逻辑。唯一的区别是我可能会将它们全部布置好,当你点击拖动时,一个新的会放在下面。

以上是关于拖动 touchesBegan 后创建的 UIView的主要内容,如果未能解决你的问题,请参考以下文章

在滚动视图上拖动视图:已收到 touchesBegan,但没有 touchesEnded 或 touchesCancelled

pressGestureRecognizer and touchesBegan

仅对 touchesBegan 和 NOT 手势识别器使用 hitTest 逻辑

如何在 touchesBegan 上的自定义 UIView 中调整 UILabel 位置?

使用UIScrollView用两根手指滚动

自定义按钮视图:检测触摸向下/向上,快速,并回退拖动到 UIScrollView