it-swarm.com.de

Wie kann man herausfinden, bei welcher Ansicht ein Touch-Event endete?

Ich möchte ein UIImage auf einen von mehreren UIButtons ziehen und es neu positionieren, je nachdem, auf welche Schaltfläche ich es ziehe.

Das Problem, auf das ich gestoßen bin, ist, dass UITouch nur die Ansicht aufzeichnet, in der meine Berührung begann. Ich möchte auf die Ansicht zugreifen, in der meine Berührung endet. Wie kann ich das machen?

Code:

-(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;
    }

}
17
Declan McKenna

Es ist sehr einfach, deine endgültig berührte Ansicht zu erkennen, versuche diesen Code

-(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);
        }

    }

}

Verwenden Sie Hit-Testing. Sie kennen den Ort dieses Punkts als CGPoint im Hinblick auf den endgültigen Überblick self.view. Dann können Sie self.view fragen, in welcher der Unteransichten sich dieser Punkt befindet:

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

Die UIView v ist die Ansicht, nach der Sie suchen.

23
matt

Angenommen, es gibt einen @property der Zielansicht in Ihrem Container, und die Zielansicht wird dem Container hinzugefügt:

@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
    }    
}
0
Yevhen Dubinin

Im Allgemeinen müssen Sie den Punkt festlegen, an dem die Berührung beendet wurde, und feststellen, ob sie in der Ansicht liegt, die Sie interessieren. Ich verwende dazu Code, der dem folgenden ähnelt:

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

(Dieser Code wurde im laufenden Betrieb bearbeitet, um eine Menge irrelevantes Material zu entfernen. Ich behalte jedoch eine Liste potenzieller Drop-Ziele in dropTargets und dies ist nur ein Blick auf diese Liste, um zu sehen, welche der potenziellen UIViews den Punkt enthalten könnte.

Wenn Sie die Ansicht oder Ansichten kennen, in die Sie das Element möglicherweise ziehen, können Sie mithilfe von CGRectContainsPoint bestimmen, ob der Rahmen dieser Ansicht den Punkt enthält. Wichtig ist zu beachten, dass sie in verschiedenen Koordinatensystemen liegen können und es möglicherweise erforderlich ist, vor dem Vergleich von einem zum anderen zu konvertieren.

0