Как узнать, на каком событии закончилось событие Touch? - программирование
Подтвердить что ты не робот

Как узнать, на каком событии закончилось событие Touch?

Я хочу перетащить UIImage на один из нескольких UIButtons и переместить его на основании того, на какую кнопку я его перетаскиваю.

Проблема, с которой я столкнулся, заключается в том, что UITouch только записывает представление, в котором началось мое касание, я хотел бы получить доступ к виду, на которое заканчивается мой контакт. Как я могу это сделать?

код:

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

    dealerBtnOrigin = [touch locationInView:self.view];

    //NSLog(@"%u %u",touch.view.tag, ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).tag);
    //CHECK TO SEE WHICH BUTTON WAS TOUCHED
    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
    {
        ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location;
    }
}

-(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];


    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
    {
        ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = location;
    }
}

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    UITouch *touch = [touches anyObject];
    CGPoint location = [touch locationInView:self.view];
    UIView *endView = [self.view hitTest:location withEvent:nil];

    if (touch.view == ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]))
    {
        NSLog(@"%u %u",endView.tag, touch.view.tag);
        if([buttons containsObject:(UIButton *)endView])
        {
            [[dealerBtns objectAtIndex:[table getButtonSeat]] setHidden:YES];
            [table passButton:touch.view.tag];
            [[dealerBtns objectAtIndex: touch.view.tag] setHidden:NO];
        }
        ((UIView *)[dealerBtns objectAtIndex:[table getButtonSeat]]).center = dealerBtnOrigin;
    }

}
4b9b3361

Ответ 1

Очень легко обнаружить ваш наконец-то затронутый вид, попробуйте этот код

-(void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    CGPoint location = [[touches anyObject] locationInView:self.view];
    CGRect fingerRect = CGRectMake(location.x-5, location.y-5, 10, 10);

    for(UIView *view in self.view.subviews){
        CGRect subviewFrame = view.frame;

        if(CGRectIntersectsRect(fingerRect, subviewFrame)){
            //we found the finally touched view
            NSLog(@"Yeah !, i found it %@",view);
        }

    }

}

Ответ 2

Используйте hit-testing. Вы знаете местоположение этого пункта как CGPoint с точки зрения максимального контроля, self.view. Затем вы можете запросить self.view, какой из подзонов находится в этой точке:

CGPoint location = [touch locationInView:self.view];
UIView* v = [self.view hitTest:location withEvent:nil];

UIView v - это вид, который вы ищете.

Ответ 3

В общем, вам нужно взять точку, в которой закончилось касание, и определить, находится ли она в интересующем вас представлении. Я делаю это, используя код, похожий на следующий:

CGPoint newCenter = dragView.center;
for (UIView *v in dropTargets)
{
    CGRect convertedTargetFrame = [v.superview convertRect:v.frame toView:nil];
    if (CGRectContainsPoint(convertedTargetFrame, newCenter))
    {
        activeTargetIndex = idx;
    }
}

(этот код был изменен "на лету", чтобы вытащить много неулокальных вещей, но я сохраняю список потенциальных целей снижения в dropTargets, и это просто просмотр этого списка, чтобы увидеть, какие из потенциальных UIView могут содержать точка).

Существенно, что если вы знаете представление или представления, к которым вы потенциально перетаскиваете элемент, вы можете определить, содержит ли этот кадр представления точку, используя CGRectContainsPoint. Важно помнить, что они могут лежать в разных системах координат, и может быть необходимо преобразовать их из одного в другое перед сравнением.

Ответ 4

Предполагая, что в вашем контейнере имеется представление @property целевого представления, а целевой вид добавляется в контейнер:

@property (nonatomic, strong) UIView* targetView;

// ...

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    NSSet* touchesForTargetView = [event touchesForView:self.targetView];
    if (touchesForTargetView.allObjects.count != 0) {
        // touch was at target view
    }
    else {
        // touch  was somewhere else
    }    
}