如何在仅选定特定textView时移动视图

4

嗨,我正在使用这段代码来在选择textView时移动我的视图,以确保当键盘弹出时我的textView可见。

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)

}

在这里输入图片描述

如果只有底部的文本视图被选中,我该如何移动视图?因为目前如果选择最上面的文本视图,则会将其移动到半个屏幕之外。

非常感谢任何帮助,提前致谢。


如果您的 UITextView 不会自己垂直滚动,为什么不将它们(以及任何其他内容)嵌入到一个允许整个屏幕滚动的单个滚动视图中呢?这样,您就可以滚动滚动视图而不是调整单个视图的框架。至于区分 UITextField,请使用委托方法,如 @konrad.bajtyngier 建议的那样。 - paulvs
4个回答

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

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
}

1
不仅仅是为了单一的文本字段而移动键盘,我建议采取更加灵活的方法。
我的做法是跟踪哪个文本字段被选中,并进行一些计算,将视图控制器的内容视图向上移动足够的距离以暴露正在变为活动状态的文本字段。
要做到这一点,您需要设置您的视图控制器成为文本字段的代理。
我有一篇详细解释这一点的开发博客文章: 移动视图以为键盘腾出空间 那篇文章中的代码是用Objective-C编写的,但概念是相同的。我不确定我是否有Swift版本的相同代码可以分享(我找到的唯一代码是我为客户完成的一个项目)。
该博客文章引用了Github上名为RandomBlobs的项目。

说@duncanC。你知道UITableView会为你做这件事。实际上,从ios10开始,还有其他什么东西在ios中为您完成此操作吗?(也许是堆栈视图或其他?)我发现很难找到关于此的文档,而我每天都在使用操作系统!干杯 - Fattie

0
我建议使用“委托(delegate)”模式。例如,您可以将底部的textView的delegate设置为self(当然首先要添加UITextViewDelegate),并实现textViewDidBeginEditing(_:)方法。当触发该方法时,您将知道用户开始编辑此特定视图。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接