确定是否拖动单元格路径==节标题路径



我正在实现自定义拖放,我想要的是创建单元格的副本(只是显示的图像)当这个副本的位置与header相同时,我想改变header的背景颜色,如果位置再次超出header帧,则恢复其背景颜色。

我被困在确定正确的路径,我得到了这个到目前为止:

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

我在逻辑中遗漏了什么?

这就是我想出来的实现,基本上紫色是你的高亮状态(意思是你的单元格副本在section header的框架内),白色是section header的默认颜色。

奇怪的是单元格只在某个重叠位置高亮,这有点奇怪

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

最新更新