2015-06-20 2 views
3

Использование UIKit Dynamics Я хочу объединить UIAttachmentBehavior и UICollisionBehavior таким образом, чтобы пользователь мог перетаскивать представление (используя UIPanGestureRecognizer), но не оставлять определенную область.Объединение UIAttachmentBehavior и UICollisionBehavior

Проблема возникает, когда пользователь/UIView сталкиваются с границами поведения столкновения, так как тогда невозможно перпендикулярное движение.

I.E. при столкновении с левой стороной границы области один «застревает» там и не может двигаться вверх или вниз, в самый раз. Перемещение UIView назад на точный путь, используемый для работы, работает.

Любая помощь, на которой работает UIDynamicItemBehavior, очень ценится (пробовала эластичность, трение и сопротивление, но безрезультатно).

enter image description here

ответ

0

Я думаю, что вы реализовали UIPanGestureRecognizer в неправильном направлении. Попробуйте следующий пример. Просто создайте новый проект и вставьте этот код в свой ViewController. Если вам нужно уменьшить область перетаскивания, вы можете играть с помощью функции dragView.

import UIKit 

class ViewController: UIViewController, UICollisionBehaviorDelegate { 

    var collision: UICollisionBehavior! 
    var animator: UIDynamicAnimator! 

    override func viewDidLoad() { 
     super.viewDidLoad() 

     let container = UIView(frame: CGRect(x: 30, y: 60, width: 300, height: 500)) 
     self.view.addSubview(container) 
     container.backgroundColor = .gray 

     self.animator = UIDynamicAnimator(referenceView: container); 
     //self.animator.setValue(true, forKey: "debugEnabled") 

     let greenBox = UIView(frame: CGRect(x: 60, y: 240, width: 50, height: 50)) 
     greenBox.backgroundColor = .green 
     container.addSubview(greenBox) 

     let blueBox = UIView(frame: CGRect(x: 10, y: 10, width: 50, height: 50)) 
     blueBox.backgroundColor = .blue 
     container.addSubview(blueBox) 

     let redBox = UIView(frame: CGRect(x: 200, y: 300, width: 50, height: 50)) 
     redBox.backgroundColor = .red 
     container.addSubview(redBox) 

     self.collision = UICollisionBehavior(items: [greenBox, blueBox, redBox]) 
     self.collision.translatesReferenceBoundsIntoBoundary = true 
     self.collision.collisionMode = .everything 
     self.animator.addBehavior(self.collision) 
     self.collision.collisionDelegate = self 


     let c = UIDynamicItemBehavior(items: [redBox]) 
     c.density = 10000 
     self.animator.addBehavior(c) 

     let noRotation = UIDynamicItemBehavior(items: [greenBox, blueBox]) 
     noRotation.allowsRotation = false 
     self.animator.addBehavior(noRotation) 

     let panGesture = UIPanGestureRecognizer(target: self, action: #selector(self.dragView(_:))) 
     greenBox.isUserInteractionEnabled = true 
     greenBox.addGestureRecognizer(panGesture) 

     let panGesture2 = UIPanGestureRecognizer(target: self, action: #selector(self.dragView(_:))) 
     blueBox.isUserInteractionEnabled = true 
     blueBox.addGestureRecognizer(panGesture2) 

    } 


    @objc func dragView(_ sender:UIPanGestureRecognizer){ 

     if let viewDrag = sender.view { 
      self.view.bringSubview(toFront: viewDrag) 
      let translation = sender.translation(in: self.view) 
      viewDrag.center = CGPoint(x: viewDrag.center.x + translation.x, y: viewDrag.center.y + translation.y) 
      sender.setTranslation(CGPoint.zero, in: self.view) 
      animator.updateItem(usingCurrentState: viewDrag) 
     } 
    } 

}