如果仅选择某个textView,如何移动视图

时间:2016-02-29 12:28:14

标签: ios swift uitextview uikeyboard

您好我在选择textView时使用此代码移动我的视图,这是为了确保键盘弹出时我的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)

}

enter image description here

如果选择底部textView,我怎么才能移动视图?因为目前如果选择最上面的textView,它会将其一半移出屏幕。

我感谢任何帮助,提前谢谢。

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

让您的班级成为UITextViewDelegate,如下所示:

class ViewController: UIViewController, UITextViewDelegate {

然后在viewDidLoad中只设置由委托控制的底部textView:

bottomTextView.delegate = self

然后您可以使用这些功能,根据需要更改值:

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


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

答案 2 :(得分:1)

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

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

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

我有一篇开发博客文章,详细解释了这一点:

Shifting views to make room for the keyboard

该帖子中的代码在Objective-C中,但概念是相同的。我不确定我在Swift中有相同的代码可以共享(我发现的唯一代码是我为客户做的项目。)

该博客帖子在Github上引用了一个名为RandomBlobs的项目。

答案 3 :(得分:0)

我建议使用delegate。例如,您可以将textView delegate设置为selfUITextViewDelegate(当然首先添加 textViewDidBeginEditing(_:))并实施;Test Message #1 ;Enter a base json here ;Windows+Ctrl+1 #^1:: SendRaw,{"field1":"data1","field2":"data2","field3":"data3"..."field12":"data12"} Return 方法。触发后,您将知道用户已开始编辑此特定视图。