我正在使用SWIFT进行iOS编程,我正在使用此代码移动UITextField,但它不起作用.我正确地调用了函数keyboardWillShow,但是文本字段没有移动.我正在使用自动布局.

override func viewDidLoad() {
    super.viewDidLoad()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object: nil);
    NSNotificationCenter.defaultCenter().addObserver(self, selector: Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object: nil);
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self);
}

func keyboardWillShow(notification: NSNotification) {
    if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
        //let contentInsets = UIEdgeInsets(top: 0, left: 0, bottom: keyboardSize.height, right: 0)

        var frame = self.ChatField.frame
        frame.origin.y = frame.origin.y - keyboardSize.height + 167
        self.chatField.frame = frame
        println("asdasd")
    }
}

推荐答案

在现有答案的基础上有几点需要改进.

首先,UIKeyboardWillChangeFrameNotification可能是最好的通知,因为它处理的更改不只是显示/隐藏,而是由于键盘更改(语言、使用第三方键盘等)而更改.也可以旋转(但请注意下面指示键盘将隐藏的注释也应进行处理,以支持硬件键盘连接).

其次,可以从通知中提取动画参数,以确保动画正确组合在一起.

可能有一些选项可以更彻底地清理这段代码,尤其是如果您对强制展开字典代码感到满意的话.

 class MyViewController: UIViewController {

   // This constraint ties an element at zero points from the bottom layout guide
   @IBOutlet var keyboardHeightLayoutConstraint: NSLayoutConstraint?
 
   override func viewDidLoad() {
     super.viewDidLoad()
     NotificationCenter.default.addObserver(self,
       selector: #selector(self.keyboardNotification(notification:)),
       name: UIResponder.keyboardWillChangeFrameNotification,
       object: nil)
   }
 
   deinit {
     NotificationCenter.default.removeObserver(self)
   }
 
   @objc func keyboardNotification(notification: NSNotification) {
     guard let userInfo = notification.userInfo else { return }

     let endFrame = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue
     let endFrameY = endFrame?.origin.y ?? 0
     let duration:TimeInterval = (userInfo[UIResponder.keyboardAnimationDurationUserInfoKey] as? NSNumber)?.doubleValue ?? 0
     let animationCurveRawNSN = userInfo[UIResponder.keyboardAnimationCurveUserInfoKey] as? NSNumber
     let animationCurveRaw = animationCurveRawNSN?.uintValue ?? UIView.AnimationOptions.curveEaseInOut.rawValue
     let animationCurve:UIView.AnimationOptions = UIView.AnimationOptions(rawValue: animationCurveRaw)

     if endFrameY >= UIScreen.main.bounds.size.height {
       self.keyboardHeightLayoutConstraint?.constant = 0.0
     } else {
       self.keyboardHeightLayoutConstraint?.constant = endFrame?.size.height ?? 0.0
     }

     UIView.animate(
       withDuration: duration,
       delay: TimeInterval(0),
       options: animationCurve,
       animations: { self.view.layoutIfNeeded() },
       completion: nil)
   }
}

Ios相关问答推荐

当操作修改查看条件时,按钮不重复

当文本为空时,具有垂直轴的SwiftUI文本字段不会与FirstTextBaseline对齐

SwiftUI-工作表不显示导航标题

在 Swift 中,对象如何被准确地从内存中移除?

不可发送类型 '[String : Any]?'在调用非隔离实例方法 XXX 时退出主参与者隔离上下文不能跨越参与者边界

iOS 16 中的状态栏 colored颜色

如何在 SwiftUI 中创建显示当前电池电量的电池徽章

具有多个目标的应用程序的动态内容

SwiftUI DatePicker 格式在每个设备上都不一样,如何让它总是显示相同的 Select 版本?

无法为 Flutter 项目构建 ipa [CocoaPods 找不到 pod "GoogleAppMeasurement" 的兼容版本:]

DateFormatter 使用 TimeZone 和 Locale 的特定组合返回 nil

如何使用 Swift 文档注释

iOS 8 - 使用自定义演示关闭视图控制器后屏幕空白

在主线程上发布 NSNotification

如何使用 sendAsynchronousRequest:queue:completionHandler:

当键盘出现在 iOS 中时,将 UIView 上移

如何在 OS X 或 iOS(不使用格式塔)中确定运行时的操作系统版本?

Swift:调用中缺少参数标签xxx

SLComposeViewController 分享教程

NSURL 到带有 XCTest 的测试包中的文件路径