2017-02-21 75 views
1

我想滑动一个文本框,它位于tableview的底部(实际上,在其页脚视图中)。所以我尝试了两种方法:键盘显示时滑动tableview

  1. 要动态自动布局约束的tableview

仍然

  • 动画内容的插图,它们的非工作或部分工作。目前,我不能对此进行测试在真实的iPad(应用程序是iPad的唯一),我在模拟器测试,但我认为这样的事情应该工作:

    1. 动画contentInsets

      func keyboardWillShow(notification: NSNotification) { 
          if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { 
           UIView.animate(withDuration: 0.2, animations: { 
            self.tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
           }) 
          } 
      } 
      
      func keyboardWillHide(notification: NSNotification) { 
          UIView.animate(withDuration: 0.2, animations: { 
           self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
          }) 
      } 
      
    2. 动画效果自动布局约束

    所以在第一个例子中,我从来没有注意到animati上,也不tableview内容移动。在第二个示例中,我创建了一个自动布局约束(底部垂直间距)的出口,但我得到了一些奇怪的结果。例如,tableview向上移动,但不完全,只有第一次。

    如果我放了一个断点,keyboardHeight等于471。我错过了一些明显的东西?

  • +0

    使用[IQKeyboardManager](https://github.com/hackiftekhar/IQKeyboardManager#installation- with-cocoapod-) – pkc456

    +0

    @ pkc456对不起,没有第三方是我的选择。 – Whirlwind

    +0

    为什么你不能在模拟器上测试? – Devster101

    回答

    2

    这就是我试过的,并且如预期的那样工作得很好。

    你能检查你的通知中心吗?

    - 动画contentInsets

    override func viewWillAppear(_ animated: Bool) { 
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardWillShow, object: nil) 
    
        NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardWillHide, object: nil) 
    } 
    
    func keyboardWillShow(notification: NSNotification) { 
        if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height { 
         UIView.animate(withDuration: 0.2, animations: { 
          self.tbl.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0) 
         }) 
        } 
    } 
    
    func keyboardWillHide(notification: NSNotification) { 
        UIView.animate(withDuration: 0.2, animations: { 
         self.tbl.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) 
        }) 
    } 
    

    - 动画自动布局约束

    确保你没有在故事板的UITableView中同时设置了底部布局和高度的限制。

    但是,还有一个更简单的方法来做到这一点,只是用UITableViewController。它默认会处理这个功能。这当然是,如果你在使用它没有问题。

    编辑

    UITextView将扮演一个有点不同UITextFieldUITextView设置为delegate。并在textViewShouldBeginEditing做所有的表格视图对齐。

    extension ViewController: UITextViewDelegate { 
        func textViewShouldBeginEditing(_ textView: UITextView) -> Bool { 
         let pointInTable:CGPoint = textView.superview!.convert(textView.frame.origin, to: tbl) 
         tbl.contentOffset = CGPoint(x: tbl.contentOffset.x, y: pointInTable.y) 
         return true 
        } 
    } 
    
    +0

    谢谢,我会尽快检查计算机,但我会说我把观察者放在viewDidLoad中,并将它们删除。不过,我肯定这些方法是有效的,因为我通过放置断点来检查。可悲的是,没有TableViewController在这里是一个选项... – Whirlwind

    +0

    奇怪的是,我已经尝试过这...它和'UITextField'一起使用。但是我正在使用'UITextView',它并不真正起作用。我的意思是,它滑动,而不是适量。至少看起来是这样。 – Whirlwind

    +0

    你想在表格页脚视图中的UITextView向上滚动? – Matt

    0

    我用IQKeyboardManager库,它可以处理这种行为:https://github.com/hackiftekhar/IQKeyboardManager

    IQKeyboardManager使您可以防止键盘的问题,向上滑动并覆盖的UITextField/UITextView的,而不需要你输入任何代码,无需其他设置。要使用IQKeyboardManager,只需将源文件添加到项目中即可。

    这很容易实现。导入带豆荚的图书馆,并只是添加,在您的AppDelegate:

    import IQKeyboardManager 
    

    而且在didFinishLaunchingWithOptions:

    IQKeyboardManager.sharedManager().enable = true