16/09/2018, 18:18

Drag and drop data giữa nhiều UICollectionView với nhau (P2)

3. Quản lý việc drag drop giữa các collection view Chúng ta thấy rằng khi kéo nhiều collection view vào chung 1 view thì mặc định chúng sẽ là các view riêng biệt ko được kết nối với nhau, do đó sẽ cần 1 object đứng ra quản lý các collection view, cho phép chúng kết nối lại với nhau. 3.1 Object ...

3. Quản lý việc drag drop giữa các collection view

Chúng ta thấy rằng khi kéo nhiều collection view vào chung 1 view thì mặc định chúng sẽ là các view riêng biệt ko được kết nối với nhau, do đó sẽ cần 1 object đứng ra quản lý các collection view, cho phép chúng kết nối lại với nhau.

3.1 Object DragDropManager

Object DragDropManager là 1 object độc lập, nó sẽ chứa view cha của 3 collection view (hay còn lại là canvas như ở P1 đã nêu), tiếp đó nó chứa các collection view của chúng ta để đảm bảo kết nối các collectionview lại

public class DragDropManager: NSObject, UIGestureRecognizerDelegate {
    fileprivate var canvas : UIView = UIView()
    fileprivate var views : [UIView] = []
    fileprivate var longPressGestureRecogniser = UILongPressGestureRecognizer()
}

object DragDropManager sẽ adopt protocol UIGestureRecognizerDelegate để có thể implement các func chúng ta sẽ dùng với long gesture. Tiếp đó chúng ta tạo 1 struct Bundle, là struct chứa thông tin từ collection nguồn, đích, toạ độ của cell vừa drag và image của cell

struct Bundle {
    var offset : CGPoint = CGPoint.zero
    var sourceDraggableView : UIView
    var overDroppableView : UIView?
    var representationImageView : UIView
    var dataItem : AnyObject
}

Chúng ta viết hàm khởi tạo init cho object DragDropManager

init(canvas : UIView, collectionViews : [UIView]) {
    
    super.init()
    
    self.canvas = canvas
    
    self.longPressGestureRecogniser.delegate = self
    self.longPressGestureRecogniser.minimumPressDuration = 0.3
    self.longPressGestureRecogniser.addTarget(self, action: #selector(DragDropManager.updateForLongPress(_:)))
    self.canvas.isMultipleTouchEnabled = false
    self.canvas.addGestureRecognizer(self.longPressGestureRecogniser)
    self.views = collectionViews
}

Nguyên tắc hoạt động ở đây là chúng ta tạo 1 LongGesture với thời gian nhấn giữ là 0.3, sau đó nó sẽ nhảy vào hàm delegate của UILongPressGestureRecognizer

Tiếp theo chúng ta sẽ implement hàm updateForLongPress sau khi đã nhẫn giữ 0.3 s

@objc func updateForLongPress(_ recogniser : UILongPressGestureRecognizer) -> Void {
    switch recogniser.state {
               
    case .began :
       
    case .changed :
        
    case .ended :
        
    default:
        break
        
    }
    
}

Từ hàm updateForLongPress chúng ta sẽ thấy cần phải xử lý 3 trạng thái của long gesture:

  • begin: lúc bắt đầu nhấn
  • changed: lúc chúng ta di chuyển đầu ngón tay
  • ended : lúc chúng ta bỏ ngón tay ra

3.2 Trạng thái .began

0