【问题标题】:Swift: move UIView on slide gestureSwift:在滑动手势上移动 UIView
【发布时间】:2016-05-15 06:26:29
【问题描述】:

我正在尝试将 UIView 上滑动手势从其初始位置移动到固定的最终位置。图像应该随着手势移动,而不是独立动画。

我没有尝试过任何事情,因为我不知道从哪里开始,使用哪个手势类。

【问题讨论】:

标签: ios iphone swift uiview uiviewanimation


【解决方案1】:

终于像下面这样了。

let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
slideUpView.addGestureRecognizer(gesture)
slideUpView.userInteractionEnabled = true
gesture.delegate = self

当检测到手势时,会调用以下函数(这里我将视图限制为最大 center.y 为 555,并且当视图移过该点时,我将重置回 554)

func wasDragged(gestureRecognizer: UIPanGestureRecognizer) {
    if gestureRecognizer.state == UIGestureRecognizerState.Began || gestureRecognizer.state == UIGestureRecognizerState.Changed {
        let translation = gestureRecognizer.translationInView(self.view)
        print(gestureRecognizer.view!.center.y)
        if(gestureRecognizer.view!.center.y < 555) {
            gestureRecognizer.view!.center = CGPointMake(gestureRecognizer.view!.center.x, gestureRecognizer.view!.center.y + translation.y)
        }else {
            gestureRecognizer.view!.center = CGPointMake(gestureRecognizer.view!.center.x, 554)
        }

        gestureRecognizer.setTranslation(CGPointMake(0,0), inView: self.view)
    }

}

【讨论】:

  • 工作正常:)
  • 可拖动视图的初始状态是什么?
【解决方案2】:

您可能想使用UIPanGestureRecognizer

let gesture = UIPanGestureRecognizer(target: self, action: Selector("wasDragged:"))
customView.addGestureRecognizer(gesture)
gesture.delegate = self

仅沿 y 轴拖动对象:

func wasDragged(gesture: UIPanGestureRecognizer) {
    let translation = gesture.translationInView(self.view)

    // Use translation.y to change the position of your customView, e.g.
    customView.center.y = translation.y // Customize this.
}

【讨论】:

  • 好的,我会试一试。谢谢。
  • 是的,明白了。我会尽力让你知道。
【解决方案3】:

斯威夫特 4:

@objc func wasDragged(_ gestureRecognizer: UIPanGestureRecognizer) {

    if gestureRecognizer.state == UIGestureRecognizer.State.began || gestureRecognizer.state == UIGestureRecognizer.State.changed {

        let translation = gestureRecognizer.translation(in: self.view)
        print(gestureRecognizer.view!.center.y)

        if(gestureRecognizer.view!.center.y < 555) {

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

        }else {
            gestureRecognizer.view!.center = CGPoint(x:gestureRecognizer.view!.center.x, y:554)
        }
        gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: self.view)
    }
}

致电

let gesture = UIPanGestureRecognizer(target: self, action: self.wasDragged(gestureRecognizer:))
customView.addGestureRecognizer(gesture)
gesture.delegate = self

【讨论】:

  • 我能问一下你为什么在 If check 上给出 555 吗?
  • EmreOnder 只是一个示例值。你可以用任何你想要的替换。
  • “MyViewController”类型的值没有成员“wasDragged(gestureRecognizer:)”
  • Hello Rails wasDragged 是在第一个代码 sn-p 中实现的函数
  • 让手势 = UIPanGestureRecognizer(target: self, action: #selector(wasDragged(_:)))
【解决方案4】:

Swift 3.x 更新

分配选择器时,语法发生了变化,现在需要#selector

let gesture = UIPanGestureRecognizer(target: self, action: #selector(navViewDragged(gesture:)))

    self.navLayoutView.addGestureRecognizer(gesture)
    self.navLayoutView.isUserInteractionEnabled = true
    gesture.delegate = self

功能实现:

func navViewDragged(gesture: UIPanGestureRecognizer){
     //Code here
}

【讨论】:

    【解决方案5】:

    在 Swift 3 中移动视图

    let panGesture = UIPanGestureRecognizer(target: self, action: #selector(dragged(gestureRecognizer:)))
    demoView.isUserInteractionEnabled = true
    demoView.addGestureRecognizer(panGesture)
    

    功能

    @objc func dragged(gestureRecognizer: UIPanGestureRecognizer) {
        if gestureRecognizer.state == UIGestureRecognizerState.began || gestureRecognizer.state == UIGestureRecognizerState.changed {
            let translation = gestureRecognizer.translation(in: self.view)
            gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x + translation.x, y: gestureRecognizer.view!.center.y + translation.y)
            gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: self.view)
        }
    }
    

    【讨论】:

      【解决方案6】:

      这就是股票应用中新闻视图的真正做法

      首先在 Storyboard 中为滑动视图添加 2 个约束,一个用于完全打开时的状态,一个用于关闭时的状态。不要忘记禁用/未安装约束之一,以便在到达场景时您的视图看起来是打开或关闭的。 在您的代码中引用它们

      @IBOutlet weak var optionsOpenedConstraint: NSLayoutConstraint!
      @IBOutlet weak var optionsVisiableConstraint: NSLayoutConstraint!
      

      现在在viewDidLoad 函数中将UIPanGestureRecognizer 添加到您的视图中。

      let gesture = UIPanGestureRecognizer(target: self, action: #selector(type(of: self).wasDragged(gestureRecognizer:)))
          optionsView.addGestureRecognizer(gesture)
      

      最后添加这个回调和 2 个函数:

      @objc func wasDragged(gestureRecognizer: UIPanGestureRecognizer) {
          let distanceFromBottom = screenHeight - gestureRecognizer.view!.center.y
          if gestureRecognizer.state == UIGestureRecognizer.State.began || gestureRecognizer.state == UIGestureRecognizer.State.changed {
              optionsOpenedConstraint.isActive = false
              optionsVisiableConstraint.isActive = false
              let translation = gestureRecognizer.translation(in: self.view)
              if((distanceFromBottom - translation.y) < 100) {
                  gestureRecognizer.view!.center = CGPoint(x: gestureRecognizer.view!.center.x, y: gestureRecognizer.view!.center.y + translation.y)
                  gestureRecognizer.setTranslation(CGPoint(x: 0, y: 0), in: self.view)
              }
      
          }
          if gestureRecognizer.state == UIGestureRecognizer.State.ended{
              if distanceFromBottom > 6{
                  openOptionsPanel()
              }else{
                  closeOptionsPanel()
              }
          }
      }
      func openOptionsPanel(){
          optionsOpenedConstraint.isActive = true
          optionsVisiableConstraint.isActive = false
          UIView.animate(withDuration: 0.5) {
              self.view.layoutIfNeeded()
          }
      }
      
      func closeOptionsPanel(){
          optionsOpenedConstraint.isActive = false
          optionsVisiableConstraint.isActive = true
          UIView.animate(withDuration: 0.5) {
              self.view.layoutIfNeeded()
          }
      }
      

      和voalá

      【讨论】:

        【解决方案7】:
        @IBAction func handlePanGesture(_ recognizer: UIPanGestureRecognizer) {
        
            if MainView.bounds.contains(mainImage.frame) {
                let recognizerCenter = recognizer.location(in:  MainView)
        
                mainImage.center = recognizerCenter
            }
        
            if MainView.bounds.intersection(mainImage.frame).width > 50 && MainView.bounds.intersection(mainImage.frame).height > 0 {
                let recognizerCenter = recognizer.location(in: MainView)
                print(recognizerCenter)
                mainImage.center = recognizerCenter
            }
        
        }
        
        @IBAction func handlePinchGesture(_ recognizer: UIPinchGestureRecognizer) {
        
            mainImage.transform = mainImage.transform.scaledBy(x: recognizer.scale, y: recognizer.scale)
            recognizer.scale = 1.0
        }
        
        @IBAction func handleRotateGesture(_ recognizer: UIRotationGestureRecognizer) {
        
            mainImage.transform = mainImage.transform.rotated(by: recognizer.rotation)
            recognizer.rotation = 0.0
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-06
          • 1970-01-01
          • 2017-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多