将 uipangesture 应用于 uitextfield
apply uipangesture to uitextfield
我的 swift 下面的代码将手势应用到文本字段就是这样。问题是当我在文本字段中输入内容时。文本字段返回到其原始约束位置。我只是不希望它在文本字段中输入文本时恢复。这是一个约束问题。如果我删除了我想要的约束。因此,要查看此效果,只需将代码复制到 Xcode 并应用故事板约束,您就会明白我的意思。
import UIKit
class fullScreen : UIViewController {
@IBOutlet var i : UItextField!
var g11 = UIPanGestureRecognizer()
override func viewDidLoad() {
g11 = UIPanGestureRecognizer(target: self, action: #selector(fullScreen.g1Method))
i.isUserInteractionEnabled = true
i.addGestureRecognizer(g11)
}
@objc func g1Method(_ sender: UIPanGestureRecognizer){
let tranistioon = sender.translation(in: self.view)
sender.view!.center = CGPoint(x: sender.view!.center.x + tranistioon.x, y: sender.view!.center.y + tranistioon.y)
sender.setTranslation(CGPoint.zero,in: self.view) }
}
您 运行 遇到的问题是 Storyboard 约束保持活动状态,class 对象的 constant
字段没有变化。解决方法如下:
我在故事板上添加了两个 IBOutlet
对相关约束的引用:
@IBOutlet var leadingConstraint: NSLayoutConstraint!
@IBOutlet var topConstraint: NSLayoutConstraint!
此外,在这些限制之下,我添加了对 textField 原点的引用,如下所示:
var textFieldOrigin = CGPoint.zero
最后,我改变了手势识别方法来区分UIPanGestureRecognizer
的状态。这是我所做的:
@objc func g1Method(_ sender: UIPanGestureRecognizer) {
if sender.state == .began {
textFieldOrigin = sender.location(in: i)
} else if sender.state == .ended {
topConstraint.constant = i.frame.origin.y - i.frame.height
leadingConstraint.constant = i.frame.origin.x
topConstraint.isActive = true
leadingConstraint.isActive = true
} else {
let location = sender.location(in: view)
i.frame.origin = CGPoint(x: location.x - textFieldOrigin.x, y: location.y - textFieldOrigin.y)
topConstraint.isActive = false
leadingConstraint.isActive = false
}
}
此代码中的关键点是关闭约束,更新它们的常量,然后在手势识别器完成后重新打开它们。
我的 swift 下面的代码将手势应用到文本字段就是这样。问题是当我在文本字段中输入内容时。文本字段返回到其原始约束位置。我只是不希望它在文本字段中输入文本时恢复。这是一个约束问题。如果我删除了我想要的约束。因此,要查看此效果,只需将代码复制到 Xcode 并应用故事板约束,您就会明白我的意思。
import UIKit
class fullScreen : UIViewController {
@IBOutlet var i : UItextField!
var g11 = UIPanGestureRecognizer()
override func viewDidLoad() {
g11 = UIPanGestureRecognizer(target: self, action: #selector(fullScreen.g1Method))
i.isUserInteractionEnabled = true
i.addGestureRecognizer(g11)
}
@objc func g1Method(_ sender: UIPanGestureRecognizer){
let tranistioon = sender.translation(in: self.view)
sender.view!.center = CGPoint(x: sender.view!.center.x + tranistioon.x, y: sender.view!.center.y + tranistioon.y)
sender.setTranslation(CGPoint.zero,in: self.view) }
}
您 运行 遇到的问题是 Storyboard 约束保持活动状态,class 对象的 constant
字段没有变化。解决方法如下:
我在故事板上添加了两个 IBOutlet
对相关约束的引用:
@IBOutlet var leadingConstraint: NSLayoutConstraint!
@IBOutlet var topConstraint: NSLayoutConstraint!
此外,在这些限制之下,我添加了对 textField 原点的引用,如下所示:
var textFieldOrigin = CGPoint.zero
最后,我改变了手势识别方法来区分UIPanGestureRecognizer
的状态。这是我所做的:
@objc func g1Method(_ sender: UIPanGestureRecognizer) {
if sender.state == .began {
textFieldOrigin = sender.location(in: i)
} else if sender.state == .ended {
topConstraint.constant = i.frame.origin.y - i.frame.height
leadingConstraint.constant = i.frame.origin.x
topConstraint.isActive = true
leadingConstraint.isActive = true
} else {
let location = sender.location(in: view)
i.frame.origin = CGPoint(x: location.x - textFieldOrigin.x, y: location.y - textFieldOrigin.y)
topConstraint.isActive = false
leadingConstraint.isActive = false
}
}
此代码中的关键点是关闭约束,更新它们的常量,然后在手势识别器完成后重新打开它们。