2017-05-01 17 views
5

Chcę móc przeciągać obiekty na ekranie, ale one nie będą. Próbowałem wszystkiego, ale wciąż nie mogę.Przeciągnij UIView Swift 3

Oto kod.

func panGesture(gesture: UIPanGestureRecognizer) { 
    switch gesture.state { 
    case .began: 
     print("Began.") 
     for i in 0..<forms.count { 
      if forms[i].frame.contains(gesture.location(in: view)) { 
       gravity.removeItem(forms[i]) 
      } 
     } 
    case .changed: 
     let translation = gesture.translation(in: forms[1]) 

     gesture.view!.center = CGPoint(x: gesture.view!.center.x + translation.x, y: gesture.view!.center.y + translation.y) 

     gesture.setTranslation(CGPoint.zero, in: self.view) 

     print("\(gesture.view!.center.x)=\(gesture.view!.center.y)") 
     print("t;: \(translation)") 
    case .ended: 
     for i in 0..<forms.count { 
      if forms[i].frame.contains(gesture.location(in: view)) { 
       gravity.addItem(forms[i]) 
      } 
     } 
     print("Ended.") 
    case .cancelled: 
     print("Cancelled") 
    default: 
     print("Default") 
    } 
} 

Również mają grawitację. Formularze są kwadratami i okręgami.

Objaśnienie: w .began - wyłączenie grawitacji dla wybranego formularza. w .changed - próbuję zmienić współrzędne. w .end - włączam ponownie grawitację.

ScreenShot.

enter image description here

enter image description here

Odpowiedz

28

Reference Odsyłacz: PanGesture in Swift 3.0

Krok 1: Weź jeden widok, który chcesz przeciągnąć w serii ujęć.

@IBOutlet weak var viewDrag: UIView! 

Krok 2: Dodaj PanGesture.

var panGesture  = UIPanGestureRecognizer() 

Etap 3: W viewDidLoad dodanie kodu poniżej.

override func viewDidLoad() { 
    super.viewDidLoad() 

    panGesture = UIPanGestureRecognizer(target: self, action: #selector(ViewController.draggedView(_:))) 
    viewDrag.isUserInteractionEnabled = true 
    viewDrag.addGestureRecognizer(panGesture) 

} 

Krok 4: Kod draggedView.

func draggedView(_ sender:UIPanGestureRecognizer){ 
    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) 
} 

Krok 5: wyjścia.

GIF

+0

Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została [przeniesiona na czat] (http://chat.stackoverflow.com/rooms/143103/discussion-on-answer-by-kirit-modi-draggable-uiview-swift-3). –

+0

Wewnątrz draggedView użyłem zamiast tego sender.view, dzięki czemu mogłem ponownie użyć funkcji draggedView dla innych przeciągalnych widoków. – Neo42

0

skorzystać z poniższego kodu do Swift 2.3

@IBOutlet weak var viewDrag: UIView! 
var panGesture = UIPanGestureRecognizer() 

W viewDidLoad dodając poniższy kod.

override func viewDidLoad() { 
super.viewDidLoad() 
var panGesture = UIPanGestureRecognizer(target: self, action:("draggedView:")) 
viewDrag.userInteractionEnabled = true 
viewDrag.addGestureRecognizer(panGesture) 
} 

func draggedView(sender:UIPanGestureRecognizer){ 
    self.view.bringSubviewToFront(viewDrag) 
    let translation = sender.translationInView(self.view) 
    viewDrag.center = CGPoint(x: viewDrag.center.x + translation.x, y: viewDrag.center.y + translation.y) 
    sender.setTranslation(CGPoint.zeroPoint, inView: self.view) 
} 

Mam nadzieję, że to pomoże komuś.