1

カスタムドラッグアンドドロップを実装しています。セルのコピー(表示用の画像のみ)を作成し、このコピーの場所がヘッダーと同じ場合、ヘッダーの背景色を変更したい、場所が再びヘッダー フレームの外にある場合は、背景色を元に戻します。

私は正しいパスを決定するために立ち往生しています、私はこれまでにこれを得ました:

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

ロジックに欠けているものは何ですか?

4

1 に答える 1

0

これが私が思いついた実装です。基本的に、紫色はハイライト状態 (セルのコピーがセクション ヘッダーのフレーム内にあることを意味します) であり、白色はセクション ヘッダーのデフォルトの色です。

奇妙なことは、セルが特定のオーバーラップ位置でのみ強調表示されることです。これはちょっと奇妙です

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: ()
    }
}
于 2015-10-19T11:02:06.953 に答える