Cocoa touch 如何使用Swift在键盘出现时向上移动UIViewController的内容

Cocoa touch 如何使用Swift在键盘出现时向上移动UIViewController的内容,cocoa-touch,keyboard,uitextfield,swift,nsnotificationcenter,Cocoa Touch,Keyboard,Uitextfield,Swift,Nsnotificationcenter,我想在键盘出现时向上移动UIViewController底部的内容。在视图控制器的底部,我有一个UITextField,当用户单击它时,键盘会出现并阻止I,t,因此用户无法看到他们在UITextField中输入的内容 我将UITextField声明如下: @IBOutlet var startTime : UITextField 我需要一个UIScrollView来完成这个任务吗?或者,是否有一种方法可以在键盘出现时向上移动页面内容。有很多方法可以实现这一点,但您始终需要收听与键盘相关的通知才

我想在键盘出现时向上移动UIViewController底部的内容。在视图控制器的底部,我有一个UITextField,当用户单击它时,键盘会出现并阻止I,t,因此用户无法看到他们在UITextField中输入的内容

我将UITextField声明如下:

@IBOutlet var startTime : UITextField

我需要一个UIScrollView来完成这个任务吗?或者,是否有一种方法可以在键盘出现时向上移动页面内容。

有很多方法可以实现这一点,但您始终需要收听与键盘相关的通知才能做到这一点。它们的工作方式与obj-c相同。下面的简化示例演示了如何在键盘出现时向上移动文本字段,在键盘关闭时向下移动文本字段。以下示例是UIViewController的一个实现

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

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self);
}

func keyboardWillShow(sender: NSNotification) {
    let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y - rect.height;
    self.textField.frame = frame;
}

func keyboardWillHide(sender: NSNotification) {
    let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y + rect.height;
    self.textField.frame = frame;
}

有很多方法可以做到这一点,但您始终需要收听与键盘相关的通知才能做到这一点。它们的工作方式与obj-c相同。下面的简化示例演示了如何在键盘出现时向上移动文本字段,在键盘关闭时向下移动文本字段。以下示例是UIViewController的一个实现

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

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self);
}

func keyboardWillShow(sender: NSNotification) {
    let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y - rect.height;
    self.textField.frame = frame;
}

func keyboardWillHide(sender: NSNotification) {
    let s:NSValue = sender.userInfo.valueForKey(UIKeyboardFrameBeginUserInfoKey) as NSValue;
    let rect :CGRect = s.CGRectValue();
    var frame = self.textField.frame;
    frame.origin.y = frame.origin.y + rect.height;
    self.textField.frame = frame;
}

我不确定这个最高评级的答案是如何运作的;不是应该是:

func keyboardWillShow(notification: NSNotification) {
    if let info: NSDictionary = notification.userInfo {
        let value: NSValue = info.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue
        let rect: CGRect = value.CGRectValue()
        view_comment.y = rect.height - view_comment.h
    }
}

由于您需要将Dictionary转换为NSDictionary才能访问valueForkey?

我不确定顶级答案是如何工作的;不是应该是:

func keyboardWillShow(notification: NSNotification) {
    if let info: NSDictionary = notification.userInfo {
        let value: NSValue = info.valueForKey(UIKeyboardFrameEndUserInfoKey) as NSValue
        let rect: CGRect = value.CGRectValue()
        view_comment.y = rect.height - view_comment.h
    }
}
因为您需要将Dictionary强制转换为NSDictionary才能访问valueForkey