Перетаскивание UIView, созданного после прикосновений - PullRequest
2 голосов
/ 01 февраля 2011

У меня есть несколько подклассов 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 отвечал на прикосновения, которые изначально были сделаны для «иконы».

Есть идеи?

Я знаю, что этот вопрос отчасти похожна этот: Как "перевести" первого респондента из одного UIView в другой? , но в этом случае представление, которое должно принимать касания, уже существует, тогда как мне нужно передать касания во вновь созданный вид.

1 Ответ

2 голосов
/ 01 февраля 2011

Я не знаю ни одного способа передать прикосновения к вновь созданному представлению, хотя это не означает, что нет способа сделать это.Похоже, вы действительно хотите, чтобы ваше перетаскиваемое представление обрабатывало прикосновения, я бы, вероятно, создал бы каждое перетаскиваемое представление с альфа 0, в то время как вы создаете не перетаскиваемые виды, а в touchesBegan установите его на 1. Если ваш- перетаскиваемые виды не должны обрабатывать прикосновения, тогда нет смысла заставлять их обрабатывать прикосновения только для того, чтобы передать их.

...