2017-02-03 82 views
0

我可以使用下面的代码移动单个UIView,但我怎么移动多个UIView的单独使用IBOutletCollectiontag值?如何拖动图像

class TeamSelection: UIViewController { 

    var location = CGPoint(x: 0, y: 0) 

    @IBOutlet weak var ViewTest: UIView! // move a single image 
    @IBOutlet var Player: [UIView]! // collection to enable different images with only one outlet 

    override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 

     let touch: UITouch = touches.first! as UITouch 
     location = touch.location(in: self.view) 
     ViewTest.center = location 

    } 

} 

回答

0

有两种基本方法:

  1. 你可以遍历您的子视图找出其中一个触摸相交和移动。但是这种方法(也不使用隐含的数值来标识视图)通常不是首选的方法。

  2. 个人而言,我把拖逻辑的子视图本身:

    class CustomView: UIView {  // or subclass `UIImageView`, as needed 
    
        private var originalCenter: CGPoint? 
        private var dragStart: CGPoint? 
    
        override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) { 
         originalCenter = center 
         dragStart = touches.first!.location(in: superview) 
        } 
    
        override func touchesMoved(_ touches: Set<UITouch>, with event: UIEvent?) { 
         guard let touch = touches.first else { return } 
         var location = touch.location(in: superview) 
         if let predicted = event?.predictedTouches(for: touch)?.last { 
          location = predicted.location(in: superview) 
         } 
         center = dragStart! + location - originalCenter! 
        } 
    
        override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) { 
         guard let touch = touches.first else { return } 
         let location = touch.location(in: superview) 
         center = dragStart! + location - originalCenter! 
        } 
    } 
    
    extension CGPoint { 
        static func +(lhs: CGPoint, rhs: CGPoint) -> CGPoint { 
         return CGPoint(x: lhs.x + rhs.x, y: lhs.y + rhs.y) 
        } 
        static func -(lhs: CGPoint, rhs: CGPoint) -> CGPoint { 
         return CGPoint(x: lhs.x - rhs.x, y: lhs.y - rhs.y) 
        } 
    } 
    

    记得设置为子视图,如果你使用这种方法,“启用用户交互”。顺便说一下,如果您要拖动这样的视图,请确保您没有对这些视图的限制,否则当自动布局引擎接下来应用自身时,所有内容都将移回原始位置。如果使用自动布局,通常会修改约束的constant


一对夫妇上拖动逻辑观察:

  • 您可能需要使用触摸预测,像上面,以降低风阻的11:43。

  • 而不是移动center到触摸的location(in:),我宁愿用我多少拖着它,要么相应地移动center或应用相应的翻译防不胜防。这是一个更好的UX,恕我直言,因为如果你抢的角落,它可以让你在角落里拖,而不是它跳的观点在触控是在屏幕的中央。

+0

谢谢,我将如何使用@IBOutlet var Player:[UIView]!在移动图像的功能内 – Chet

+0

@Chet - 你有插座的事实是无关紧要的。问题是你如何实例化这些视图。例如,如果在IB中,请确保将这些玩家视图的基类指定为上面显示的自定义类。但是,所有的'@ IBOutlet'东西是不变的 – Rob

+0

我忘了子类分配给imagueView – Chet

0

我想创建一个支持拖动的UIView的子类。喜欢的东西:

class DraggableView: UIView { 

      func setDragGesture() { 
       let panRecognizer = UIPanGestureRecognizer(target: self, action: #selector(DraggableView.handlePanGesture(_:))) 
       addGestureRecognizer(panRecognizer) 
      } 

     func handlePanGesture(_ recognizer: UIPanGestureRecognizer) { 
      guard let parentView = self.superview else { return } 

      let translation = recognizer.translation(in: parentView) 
      recognizer.view?.center = CGPoint(x: recognizer.view!.center.x + translation.x, y: recognizer.view!.center.y + translation.y) 
      recognizer.setTranslation(CGPoint.zero, in: self) 
     } 


      func getLocation() -> CGPoint { 
      return UIView().convert(center, to: self.superview) 
     } 
    } 

,那么你可以添加可拖动的意见数组,然后询问位置,当您需要结束显示该视图控制器。