如果只选择了某个 textView 如何移动视图

How to move view if only a certain textView is selected

您好,当 textView 被 selected 时,我正在使用这段代码移动我的视图,这是为了确保我的 texView 在键盘弹出时可见。

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


func keyboardWillHide(sender: NSNotification) {

    let userInfo: [NSObject : AnyObject] = sender.userInfo!
    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    self.view.frame.origin.y += keyboardSize.height

}

func keyboardWillShow(sender: NSNotification) {

    let userInfo: [NSObject : AnyObject] = sender.userInfo!

    let keyboardSize: CGSize = userInfo[UIKeyboardFrameBeginUserInfoKey]!.CGRectValue.size
    let offset: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]!.CGRectValue.size

    if keyboardSize.height == offset.height {
        if self.view.frame.origin.y == 0 {
            UIView.animateWithDuration(0.1, animations: { () -> Void in
                self.view.frame.origin.y -= keyboardSize.height
            })
        }
    } else {
        UIView.animateWithDuration(0.1, animations: { () -> Void in
            self.view.frame.origin.y += keyboardSize.height - offset.height
        })
    }
    print(self.view.frame.origin.y)

}


override func viewWillDisappear(animated: Bool) {

    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: self.view.window)
    NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: self.view.window)

}

如果底部 textView 是 selected,我如何才能移动视图?因为目前如果你 select 最上面的 textView 它会将它的一半移出屏幕。

非常感谢任何帮助,在此先感谢。

我建议使用 delegate。例如,您可以将 bottom textViewdelegate 设置为 self(当然要先添加 UITextViewDelegate)并实现 textViewDidBeginEditing(_:) 方法。触发后,您将知道用户开始编辑此特定视图。

让你的 class 成为 UITextViewDelegate 像这样:

class ViewController: UIViewController, UITextViewDelegate {

然后在viewDidLoad中只设置底部的textView被delegate控制:

bottomTextView.delegate = self

然后您可以使用这些函数,根据您的需要更改值:

func textViewDidBeginEditing(textView: UITextView) {
    self.view.frame.origin.y -= 150
}


func textViewDidEndEditing(textView: UITextView) {
    self.view.frame.origin.y += 150
}

在通知回调中检查 bottomTextView.isFirstResponder() 并仅在其为真时才移动视图。否则不要移动视图。

我建议采用更灵活的方法,而不是仅为单个文本字段移动键盘。

我所做的是跟踪哪个文本字段被选中,并进行一些计算以将视图控制器的内容视图向上移动到足以暴露正在变为活动状态的文本字段。

为此,您需要将视图控制器设置为文本字段的委托。

我有一个开发博客 post 详细解释了这一点:

Shifting views to make room for the keyboard

post 中的代码在 Objective-C 中,但概念相同。我不确定我在 Swift 中是否有可以共享的相同代码(我找到的唯一代码是在我为客户所做的项目中。)

该博客 post 引用了 Github 上名为 RandomBlobs 的项目。