ios Swift:在滑动手势上移动 UIView

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/35221408/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-31 08:25:34  来源:igfitidea点击:

Swift: move UIView on slide gesture

iosiphoneswiftuiviewuiviewanimation

提问by Rao

I am trying to move a UIView on slide up gesture from its initial position to a fixed final position. The image should move with the hand gesture, and not animate independently.

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

I haven't tried anything as I have no clue where to start, which gesture class to use.

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

enter image description here

在此处输入图片说明

回答by Rao

Finally did it like below.

终于像下面那样做了。

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

The following function is called when the gesture is detected, (here I am restricting the view to have a maximum centre.y of 555, & I'm resetting back to 554 when the view moves past this point)

检测到手势时调用以下函数,(这里我将视图限制为最大 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)
    }

}

回答by xoudini

You probably want to use a UIPanGestureRecognizer.

您可能想要使用UIPanGestureRecognizer.

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

And to drag the object only along the y-axis:

并仅沿 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.
}

回答by Sazzad Hissain Khan

Swift 4:

斯威夫特 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)
    }
}

Call

称呼

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

回答by Sazzad Hissain Khan

Update for Swift 3.x

Swift 3.x 更新

When assigning the selector, the syntax has changed and now requires #selector

分配选择器时,语法已更改,现在需要 #selector

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

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

Function implementation:

功能实现:

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

回答by Manish Mahajan

Move view anywhere in Swift 3

在 Swift 3 中的任意位置移动视图

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

Function

功能

@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)
    }
}

回答by Saleh Altahini

This is how you really do it like the news view in the Stocks app

这就是你如何像股票应用程序中的新闻视图一样真正做到这一点

First add 2 constraints in Storyboard to the sliding view, one for it's state when it's fully opened and one for when it's closed. Don't forget to leave one of the constraints disabled / not installed so that your view will look opened or closed when the scene is reached. Reference them in your code

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

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

now add the UIPanGestureRecognizerto your view in the viewDidLoadfunction.

现在UIPanGestureRecognizerviewDidLoad函数中添加到您的视图中。

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

finally add this callback and 2 functions:

最后添加此回调和 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()
    }
}

and voalá enter image description here

和 voalá 在此处输入图片说明

回答by Pratik Patel

@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

}