Drag n Drop: Element eines TableViews

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Drag n Drop: Element eines TableViews

    Hi!

    Habe mehrere Elemente (Views) in einer TableView. Man soll diese per Drag n Drop auf dem Superview platzieren können. Und wenn man den gedraggten view anklickt soll er wieder zurück in die Tabelle an "seinen" Platz und dann auch wieder mit der tabelle mitscrollen.

    Bis jetzt habe ich mit einem PanGesture schon die Position wo gedropped wird. Allerdings wird die view nur innerhalb der Table angezeigt. Außerhalb davon ist sie nicht sichtbar.

    Wie würdet ihr das lösen?

    Danke!
  • Ich würde während des Drag & Drops nicht die View-Hierarchie des Tableviews ändern. Der verwaltet schließlich die Zellen und mag es wahrscheinlich nicht, wenn ihm jemand dazwischenfunkt.

    Stattdessen kannst Du für die Operation ein Bild von der Zelle aufnehmen, das Du verschiebst. Das Bild packst Du in einen View oder einen Layer, den Du in einen gemeinsamen Superview (bzw. Superlayer) vom Tableview und dem Zielview als letztes Element ablegst. Dadurch sollte er immer oberhalb der anderen Views liegen. Bei der Verwendung eines Layers kannst Du hier auch mit dem Z-Index arbeiten. In diesen Superview legst Du auch die entsprechenden Gesture-Recognizer an.
    „Meine Komplikation hatte eine Komplikation.“
  • danyball schrieb:

    Achso! Ich hab aber auf der Zelle mehrere Views. Die möchte ich verschieben.

    Du kannst auch von der kompletten Zelle einen Schnappschuss machen.

    danyball schrieb:

    Würdest du den Screenshot dann im Moment des draggens machen?

    Beim Anklicken

    danyball schrieb:

    Nur da hat der User ja schon das source-view angeklickt und nicht die "Kopie"?!

    Was Du verschiebst, entscheidest Du. Das ist nicht davon abhängig, was Du angeklickt hast.
    „Meine Komplikation hatte eine Komplikation.“
  • Ich habe so etwas ähnliches vor einiger Zeit mal testweise für einen Collectionview mit einem Layer gemacht. Der Handler verschiebt den Layer und lässt die Zellen in Ruhe:

    Quellcode

    1. - (IBAction)handlePanGesture:(UIPanGestureRecognizer *)inRecognizer {
    2. UICollectionView *theView = self.collectionView;
    3. CGPoint thePoint = [inRecognizer locationInView:theView];
    4. NSIndexPath *theIndexPath = [self.collectionView indexPathForItemAtPoint:thePoint];
    5. switch(inRecognizer.state) {
    6. case UIGestureRecognizerStateBegan: {
    7. UICollectionViewCell *theCell = [theView cellForItemAtIndexPath:theIndexPath];
    8. CGPoint theOrigin;
    9. self.selectionLayer = [self selectionLayerForCell:theCell];
    10. [theView.layer addSublayer:self.selectionLayer];
    11. theOrigin = self.selectionLayer.frame.origin;
    12. self.panOffset = CGPointMake(theOrigin.x - thePoint.x, theOrigin.y - thePoint.y);
    13. self.panIndexPath = theIndexPath;
    14. break;
    15. }
    16. case UIGestureRecognizerStateChanged: {
    17. UICollectionViewCell *theCell = [theView cellForItemAtIndexPath:theIndexPath];
    18. CGPoint theOrigin = CGPointMake(thePoint.x + self.panOffset.x, thePoint.y + self.panOffset.y);
    19. CGRect theFrame = self.selectionLayer.frame;
    20. theCell.highlighted = YES;
    21. theFrame.origin = theOrigin;
    22. [CATransaction begin];
    23. [CATransaction setAnimationDuration:0.0];
    24. self.selectionLayer.frame = theFrame;
    25. [CATransaction commit];
    26. break;
    27. }
    28. case UIGestureRecognizerStateEnded: {
    29. if(theIndexPath != nil) {
    30. [self exchangeValueFromIndex:self.panIndexPath.row withValueAtIndex:theIndexPath.row];
    31. }
    32. }
    33. case UIGestureRecognizerStateCancelled:
    34. [self.selectionLayer removeFromSuperlayer];
    35. self.selectionLayer = nil;
    36. break;
    37. };
    38. }
    Alles anzeigen
    „Meine Komplikation hatte eine Komplikation.“