iphone - mac - Einfaches Ziehen und Ablegen in iOS




swift drag and drop ios (5)

Ich möchte eine Ansicht haben, in der Fahrzeuge herumfahren, die der Benutzer auch per Drag and Drop ziehen kann. Was ist Ihrer Meinung nach die beste groß angelegte Strategie dafür? Ist es am besten, Berührungsereignisse von den Ansichten zu erhalten, die die Fahrzeuge darstellen, oder von der größeren Ansicht? Gibt es ein einfaches Paradigma, das Sie zum Ziehen und Ablegen verwendet haben und mit dem Sie zufrieden sind? Was sind die Nachteile verschiedener Strategien?



Ich hatte einen Fall, in dem ich uiviews zwischen mehreren anderen uiviews ziehen / ablegen wollte. In diesem Fall habe ich die beste Lösung gefunden, um die Pan-Ereignisse in einer Super-Ansicht zu verfolgen, die alle Drop-Zonen und alle Drag Gable-Objekte enthält. Der Hauptgrund für das Hinzufügen der Ereignis-Listener zu den tatsächlichen gezogenen Ansichten war, dass ich die laufenden Schwenkereignisse verlor, sobald ich die Superansicht für die gezogene Ansicht änderte.

Stattdessen implementierte ich eine eher generische Drag-Drop-Lösung, die für einzelne oder mehrere Drop-Zonen verwendet werden kann.

Ich habe ein einfaches Beispiel erstellt, das hier zu sehen ist: Ziehen Sie eine Drop-Uiviews zwischen mehrere andere uiviews

Wenn Sie sich entschließen, in die andere Richtung zu gehen, verwenden Sie anstelle von uibutton uicontrol. Sie deklarieren die addTarget-Methoden und sind viel einfacher zu erweitern - geben also benutzerdefinierten Status und Verhalten.


Zusätzlich zu Ohho's Antwort habe ich eine ähnliche Implementierung versucht, aber ohne Problem von "schnellem" Ziehen und Zentrieren auf ziehen.

Die Tasteninitialisierung ist ...

UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragInside];
[button addTarget:self action:@selector(imageMoved:withEvent:) forControlEvents:UIControlEventTouchDragOutside];
[button setImage:[UIImage imageNamed:@"vehicle.png"] forState:UIControlStateNormal];
[self.view addSubview:button];

und Methodenimplementierung:

- (IBAction) imageMoved:(id) sender withEvent:(UIEvent *) event
{
    UIControl *control = sender;

    UITouch *t = [[event allTouches] anyObject];
    CGPoint pPrev = [t previousLocationInView:control];
    CGPoint p = [t locationInView:control];

    CGPoint center = control.center;
    center.x += p.x - pPrev.x;
    center.y += p.y - pPrev.y;
    control.center = center;
}

Ich sage nicht, dass dies die perfekte Lösung für die Antwort ist. Nichtsdestotrotz fand ich dies die einfachste Lösung zum Ziehen.


ohho's Antwort hat gut für mich funktioniert. Falls Sie die schnelle Version 2.x benötigen:

override func viewDidLoad() {

    let myButton = UIButton(type: .Custom)
    myButton.setImage(UIImage(named: "vehicle"), forState: .Normal)

    // drag support
    myButton.addTarget(self, action:#selector(imageMoved(_:event:)), forControlEvents:.TouchDragInside)
    myButton.addTarget(self, action:#selector(imageMoved(_:event:)), forControlEvents:.TouchDragOutside)
}

private func imageMoved(sender: AnyObject, event: UIEvent) {
    guard let control = sender as? UIControl else { return }
    guard let touches = event.allTouches() else { return }
    guard let touch = touches.first else { return }

    let prev = touch.previousLocationInView(control)
    let p = touch.locationInView(control)
    var center = control.center
    center.x += p.x - prev.x
    center.y += p.y - prev.y
    control.center = center
}

-(void)funcAddGesture
{ 

 // DRAG BUTTON
        UIPanGestureRecognizer *panGestureRecognizer;
        panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(dragButton:)];
        panGestureRecognizer.cancelsTouchesInView = YES;

        UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
        button.frame = CGRectMake(50, 100, 60, 60);
        [button addTarget:self action:@selector(buttontapEvent) forControlEvents:UIControlEventPrimaryActionTriggered];
        [button setImage:[UIImage imageNamed:@"button_normal.png"] forState:UIControlStateNormal];
        [button addGestureRecognizer:panGestureRecognizer];
        [self.view addSubview:button];
}


- (void)dragButton:(UIPanGestureRecognizer *)recognizer {

    UIButton *button = (UIButton *)recognizer.view;
    CGPoint translation = [recognizer translationInView:button];

    float xPosition = button.center.x;
    float yPosition = button.center.y;
    float buttonCenter = button.frame.size.height/2;

    if (xPosition < buttonCenter)
        xPosition = buttonCenter;
    else if (xPosition > self.view.frame.size.width - buttonCenter)
        xPosition = self.view.frame.size.width - buttonCenter;

    if (yPosition < buttonCenter)
        yPosition = buttonCenter;
    else if (yPosition > self.view.frame.size.height - buttonCenter)
        yPosition = self.view.frame.size.height - buttonCenter;

    button.center = CGPointMake(xPosition + translation.x, yPosition + translation.y);
    [recognizer setTranslation:CGPointZero inView:button];
}


- (void)buttontapEvent {

    NSLog(@"buttontapEvent");
}




touch