2013-07-02 39 views
5

Tôi cần kéo một ô từ CollectionView Một và thả nó vào CollectionView Hai. The Drag & Thả bên trong một CollectionView là không có vấn đề, nhưng làm thế nào tôi có thể lấy Cell ra khỏi CollectionView One to CollectionView Two?Kéo và thả giữa hai UICollectionViews

Bất kỳ ý tưởng nào? Bất kỳ dự án hoặc khung công tác nào đã giải quyết vấn đề này? Cảm ơn bạn đã trợ giúp!

+1

Bạn sẽ phải tạo ô "giả" trong phần giám sát của cả hai chế độ xem bộ sưu tập. tức là mặt bằng chung duy nhất. Sau đó, đánh chặn nơi này được di chuyển và xóa nó/thêm nó vào các khung nhìn bộ sưu tập khi cần thiết. – Fogmeister

Trả lời

3

https://github.com/Ice3SteveFortune/i3-dragndrop Kiểm tra điều này - trợ giúp của nó mà tôi đang làm để đạt được điều đó. Nó cũng hỗ trợ tableviews

CẬP NHẬT

Tôi vừa mới phát hành phiên bản thứ hai của codebase này, được gọi là BetweenKit. Bây giờ nó là một khung công tác kéo thả hoàn chỉnh.

Hy vọng nó chứng tỏ hữu ích!

1

Khi bạn chọn ô từ chế độ xem bộ sưu tập đầu tiên, hãy xóa ô khỏi chế độ xem bộ sưu tập này, tạo chế độ xem mới dưới dạng bản sao của ô đó làm chế độ xem phụ của người giám sát ở đầu tất cả các chế độ xem. Làm cho chế độ xem đó có thể di chuyển bằng cử chỉ pan. Ngay khi bạn "thả" ô trung gian này, hãy phát hiện vị trí của nó và thêm nó vào chế độ xem bộ sưu tập hiện tại.

2

Ok, đây là dòng chảy đơn giản nhất bao giờ hết cho các ví dụ sau:

enter image description here

  1. Thêm UIGestureRecognizer cho mỗi của UICollectionView.
  2. Connect mỗi nhận dạng cử chỉ với một phương pháp:

    @IBAction func longPressGestureChanged(recognizer: UILongPressGestureRecognizer) { ... } 
    
  3. Trong UIViewController thêm @IBOutlet cho mỗi UICollectionView:

    @IBOutlet var collectionViewGreen: UICollectionView! 
    @IBOutlet var collectionViewYellow: UICollectionView! 
    
  4. Thực hiện phương pháp cử chỉ nhận dạng để phát hiện những thay đổi:

    @IBAction func longPressGestureChanged(recognizer: UILongPressGestureRecognizer) { 
    
        let globalLocation = recognizer.locationInView(view) 
    
        if CGRectContainsPoint(collectionViewGreen.frame, globalLocation) { 
    
         //you cover green collection view 
         let point = view.convertPoint(globalLocation, toView: collectionViewGreen) 
         if let indexPath = collectionViewGreen.indexPathForItemAtPoint(point) { 
          //you cover cell in green collection view 
         } else { 
          //you do not cover any of cells in green collection view 
         } 
    
        } else if CGRectContainsPoint(collectionViewYellow.frame, globalLocation) { 
    
         //you cover yellow collection view 
         let point = view.convertPoint(globalLocation, toView: collectionViewYellow) 
         if let indexPath = collectionViewYellow.indexPathForItemAtPoint(point) { 
          //you cover cell in yellow collection view 
         } else { 
          //you do not cover any of cells in yellow collection view 
         } 
    
        } else { 
         //you do not cover any of collection views 
        } 
    }