【问题标题】:Move textfield up when keyboard covers it up键盘覆盖时向上移动文本字段
【发布时间】:2014-06-11 18:57:35
【问题描述】:

我对 Objective C 不太熟悉,想知道在 Swift 中是否有解决方案。

这是我正在玩的一个非常简单的 SingleView 应用程序。 UIView 继承自 UIControl。

我没有 UIScrollView,我不能将整个视图向上移动吗?我相信键盘是独立的。

【问题讨论】:

  • 这不是一个 Swift 问题,而是一个 UIKit 问题。 Apple 已发布有关此主题的指南。
  • @jtbandes 我代表 Marin 添加了 [uikit] 标签,我认为这仍然是一个有效的问题,即使标签不好? – 然而,我不知道答案,但祝你好运找到解决方案 Marin :)

标签: ios swift uikit


【解决方案1】:

用 Swift 重新编码 Apple 的建议。

确保您的控件位于 ScrollView 上,并注意选择器字符串中的冒号。我使用一个变量(activeField)来表示活动的文本字段。

var activeField: UITextField?

@IBAction func editingBegan(sender: UITextField) {
    activeField = sender
}

 override func viewWillAppear(animated: Bool) {
    super.viewWillAppear(animated)
    let center = NSNotificationCenter.defaultCenter()
    center.addObserver(self, selector: "keyboardOnScreen:", name: UIKeyboardDidShowNotification, object: nil)
    center.addObserver(self, selector: "keyboardOffScreen:", name: UIKeyboardDidHideNotification, object: nil)

}

func keyboardOnScreen(notification: NSNotification){
    let info: NSDictionary  = notification.userInfo!
    let kbSize = info.valueForKey(UIKeyboardFrameEndUserInfoKey)?.CGRectValue().size
    let contentInsets:UIEdgeInsets  = UIEdgeInsetsMake(0.0, 0.0, kbSize!.height, 0.0)
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets
    var aRect: CGRect = self.view.frame
    aRect.size.height -= kbSize!.height
    //you may not need to scroll, see if the active field is already visible
    if (!CGRectContainsPoint(aRect, activeField!.frame.origin) ) {
        let scrollPoint:CGPoint = CGPointMake(0.0, activeField!.frame.origin.y - kbSize!.height)
        scrollView.setContentOffset(scrollPoint, animated: true)
    }

}


func keyboardOffScreen(notification: NSNotification){
    let contentInsets:UIEdgeInsets = UIEdgeInsetsZero
    scrollView.contentInset = contentInsets
    scrollView.scrollIndicatorInsets = contentInsets
}

【讨论】:

  • 你有苹果推荐的源链接吗?
  • 我使用了上面jsd的链接,然后用Swift重写了。
  • @IBAction func editingBegan(sender: UITextField) { activeField = sender } 这部分代码不起作用,不如看我下面修改的代码适用于所有设备,只需要复制粘贴。
【解决方案2】:

我在这里使用了代码。不需要添加滚动视图

Move uitextfield up when keyboard shows

func textFieldDidBeginEditing(textField: UITextField) {
        animateViewMoving(true, moveValue: 100)
}
func textFieldDidEndEditing(textField: UITextField) {
        animateViewMoving(false, moveValue: 100)
}

func animateViewMoving (up:Bool, moveValue :CGFloat){
    var movementDuration:NSTimeInterval = 0.3
    var movement:CGFloat = ( up ? -moveValue : moveValue)
    UIView.beginAnimations( "animateView", context: nil)
    UIView.setAnimationBeginsFromCurrentState(true)
    UIView.setAnimationDuration(movementDuration )
    self.view.frame = CGRectOffset(self.view.frame, 0,  movement)
    UIView.commitAnimations()
}

【讨论】:

    【解决方案3】:

    https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html

    查看“接收键盘通知”。

    该文档中的代码示例都是 Obj-C,因此您必须自己将其转换为 swift,但正如 @jtbandes 所说,这本身并不是一个 swift 问题。

    【讨论】:

      【解决方案4】:

      我刚刚将上面的 ChinLoong 答案更新为 Swift 3 语法。不幸的是,我还不能添加 cmets。

      func textFieldDidBeginEditing(_ textField: UITextField) {
          animateViewMoving(up: true, moveValue: 100)
      }
      func textFieldDidEndEditing(_ textField: UITextField) {
          animateViewMoving(up: false, moveValue: 100)
      }
      
      func animateViewMoving (up:Bool, moveValue :CGFloat){
          let movementDuration:TimeInterval = 0.3
          let movement:CGFloat = ( up ? -moveValue : moveValue)
          UIView.beginAnimations( "animateView", context: nil)
          UIView.setAnimationBeginsFromCurrentState(true)
          UIView.setAnimationDuration(movementDuration )
          self.view.frame = self.view.frame.offsetBy(dx: 0,  dy: movement)
          UIView.commitAnimations()
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-05-01
        • 1970-01-01
        • 2015-05-03
        • 1970-01-01
        • 2016-07-07
        • 2020-05-21
        • 1970-01-01
        相关资源
        最近更新 更多