将 uipangesture 应用于 uitextfield

Posted

技术标签:

【中文标题】将 uipangesture 应用于 uitextfield【英文标题】:apply uipangesture to uitextfield 【发布时间】:2020-02-12 19:33:40 【问题描述】:

我下面的 swift 代码将 pangesture 应用于文本字段。问题是当我在文本字段中输入内容时。文本字段回到原来的约束位置。我只是不希望它在文本输入到文本字段时恢复。这是一个约束问题。如果我删除我想要的约束。所以要看到这种效果,只需将代码复制到 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)    



【问题讨论】:

我们在这里遗漏了一些代码;你问的是UITextField,但你的代码有一个IBOutlet 代表UIImageView。这里是否还有更多内容可供我们使用? 你的权利我最删除了错误的var。但是现在代码是正确的,问题仍然存在。 【参考方案1】:

您遇到的问题是 Storyboard 约束保持活动状态,而类对象的 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
        
    

此代码中的关键点是关闭约束,更新它们的常量,然后在手势识别器完成后重新打开它们。

【讨论】:

你能看看我刚才问的这个问题***.com/questions/60271523/…

以上是关于将 uipangesture 应用于 uitextfield的主要内容,如果未能解决你的问题,请参考以下文章

SpriteKit 中的 UIPanGesture

IOS:UIPanGesture 不适用于 ios 4.3

点击单元格时从 uitableviewcell 类调用 uipangesture

使用 UIPanGesture 将图像的位置存储到 Objc 中 UIView 中的新位置

仅在 iPhone 上水平添加 UIPanGesture

禁用 UILabel、UIText 等的自动调整字体。在 iOS/Swift 中?