1

I am implementing a custom drag and drop, what i want is create a copy of the cell (just an image for the display) and when the location of this copy is the same that an header i want to change the background color of the header, and revert his background color if the location is out of the header frame again.

I am stuck to determine the right path, i got this so far :

var draggedCellIndexPath: NSIndexPath?
var draggingView: UIView?
var sectionCell: UICollectionReusableView?

func handleLongPress(longPressRecognizer: UILongPressGestureRecognizer)
{
    let touchLocation = longPressRecognizer.locationInView(self.collectionView)
    switch (longPressRecognizer.state) {
    case UIGestureRecognizerState.Began:
        draggedCellIndexPath = self.collectionView!.indexPathForItemAtPoint(touchLocation)
        break;
    case UIGestureRecognizerState.Changed:
                    if draggedCellIndexPath != nil {
            draggingView!.center = CGPoint(x: touchLocation.x + touchOffsetFromCenterOfCell!.x, y: touchLocation.y + touchOffsetFromCenterOfCell!.y)

            if !isAutoScrolling {

                    let scroller = self.shouldAutoScroll(touchLocation)
                    if  (scroller.shouldScroll) {
                        self.autoScroll(scroller.direction)
                    }
            }


            let currentTouchLocation = self.longPressRecognizer.locationInView(self.collectionView!.superview)
            draggedCellIndexPathOnLocation = self.collectionView!.indexPathForItemAtPoint(currentTouchLocation)
            let attributes = self.collectionView?.layoutAttributesForSupplementaryElementOfKind(UICollectionElementKindSectionHeader, atIndexPath: draggedCellIndexPathOnLocation!)
            if draggedCellIndexPathOnLocation != nil
            {
                print("section \(draggedCellIndexPathOnLocation!.section)")
                if attributes!.frame.intersects(draggingView!.bounds)
                {
                    print("section number: \(draggedCellIndexPathOnLocation!.section)")
                    print("section is here")
               }
        break;
    case UIGestureRecognizerState.Ended:
        break;
    default: ()
    }
}

what am i missing in the logic?

thibaut noah
  • 1,474
  • 2
  • 11
  • 39

1 Answers1

0

So here is the implementation i came up with, basically the purple color is your hilight state (meaning your cell copy is inside the frame of the section header) and the white color is the default color of the section header.

Weird thing being that the cell highlight only on a certain overlap position, this is kinda weird

var sectionCell: UICollectionReusableView?
var tempSectionIndex = Int()
var tempPath: NSIndexPath?

func handleLongPress(longPressRecognizer: UILongPressGestureRecognizer)
{
    // get the current location inside the view
    let touchLocation = longPressRecognizer.locationInView(self.collectionView)
    switch (longPressRecognizer.state) {
    case UIGestureRecognizerState.Began:

        // get indexPath from location
        draggedCellIndexPath = self.collectionView!.indexPathForItemAtPoint(touchLocation)
        if draggedCellIndexPath != nil {

            // get cel for indexPath and create visual copy of the cell
            let draggedCell = self.collectionView!.cellForItemAtIndexPath(draggedCellIndexPath!) as UICollectionViewCell!
            draggingView = UIImageView(image: getRasterizedImageCopyOfCell(draggedCell))
            draggingView!.center = draggedCell.center
            self.collectionView!.addSubview(draggingView!)

            // put copy cell on screen with animation
            touchOffsetFromCenterOfCell = CGPoint(x: draggedCell.center.x - touchLocation.x, y: draggedCell.center.y - touchLocation.y)
            UIView.animateWithDuration(0.4, animations: { () -> Void in
                self.draggingView!.transform = CGAffineTransformMakeScale(0.8, 0.8)
                self.draggingView!.alpha = 0.8
            })
        }
        break;
    case UIGestureRecognizerState.Changed:
        if draggedCellIndexPath != nil {

            // update copy cell position
            draggingView!.center = CGPoint(x: touchLocation.x + touchOffsetFromCenterOfCell!.x, y: touchLocation.y + touchOffsetFromCenterOfCell!.y)
            if !isAutoScrolling {
                    let scroller = self.shouldAutoScroll(touchLocation)
                    if  (scroller.shouldScroll) {
                        self.autoScroll(scroller.direction)
                    }
            }
           if let draggedCellIndexPathOnLocation = self.collectionView?.indexPathForItemAtPoint(touchLocation)
           {
                if tempPath != nil && tempPath?.section != draggedCellIndexPathOnLocation.section {
                    sectionCell!.backgroundColor = UIColor.whiteColor()
                }
                // get header section attributes for current indexPath
                if let attributes = self.collectionView?.layoutAttributesForSupplementaryElementOfKind(UICollectionElementKindSectionHeader, atIndexPath: draggedCellIndexPathOnLocation)
                {
                    // get header section cell for current indexPath
                    if let tempSectionCell = self.collectionView?.supplementaryViewForElementKind(UICollectionElementKindSectionHeader, atIndexPath: draggedCellIndexPathOnLocation)
                    {
                        // check intersection between copy cell and header section cell
                        if attributes.frame.intersects(draggingView!.frame)
                        {
                            tempSectionCell.backgroundColor = UIColor.purpleColor()
                        }
                        else
                        {
                            tempSectionCell.backgroundColor = UIColor.whiteColor()
                        }
                        // set temp variables to keep path and section cell
                        sectionCell = tempSectionCell
                        tempPath = draggedCellIndexPathOnLocation
                    }
                }
            }
        }
        break;
    case UIGestureRecognizerState.Ended:
        // delete copy cell and reset variables
        if draggingView != nil
        {
            self.draggingView!.removeFromSuperview()
        }
        self.draggingView = nil
        self.draggedCellIndexPath = nil
        self.isAutoScrolling = false
        sectionCell!.backgroundColor = UIColor.whiteColor()
        break;
    default: ()
    }
}
thibaut noah
  • 1,474
  • 2
  • 11
  • 39