Swift:键盘显示时向上滚动视图

我有一个scrollView,我想显示键盘时向上滚动。

键盘显示时出现此错误:

2014-09-29 14:48:50.738 swrd [1563:472888] – [swrd.EditPhotoViewController keyboardWasShown]:无法识别的select器发送到实例0x14ed36640

这是我的代码,怎么了?

func registerForKeyboardNotifications ()-> Void { NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown", name: UIKeyboardDidShowNotification, object: nil) NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillBeHidden", name: UIKeyboardWillHideNotification, object: nil) } func deregisterFromKeyboardNotifications () -> Void { let center: NSNotificationCenter = NSNotificationCenter.defaultCenter() center.removeObserver(self, name: UIKeyboardDidHideNotification, object: nil) center.removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) } func keyboardWasShown (notification: NSNotification) { let info : NSDictionary = notification.userInfo! let keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.frame let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, keyboardSize!.height, 0) self.scrollView.contentInset = insets self.scrollView.scrollIndicatorInsets = insets self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y + keyboardSize!.height) } func keyboardWillBeHidden (notification: NSNotification) { let info : NSDictionary = notification.userInfo! let keyboardSize = info.objectForKey(UIKeyboardFrameBeginUserInfoKey)?.frame let insets: UIEdgeInsets = UIEdgeInsetsMake(self.scrollView.contentInset.top, 0, keyboardSize!.height, 0) self.scrollView.contentInset = insets self.scrollView.scrollIndicatorInsets = insets } override func viewWillAppear(animated: Bool) { super.viewWillAppear(true) self.registerForKeyboardNotifications() } override func viewWillDisappear(animated: Bool) { super.viewWillDisappear(true) self.deregisterFromKeyboardNotifications() } 

在你的代码中, keyboardWasShownkeyboardWasHidden每个都有一个参数NSNotification 。 你需要用一个冒号在addObserver终止你的select器,以便它通过。 即, keyboardWasShownkeyboardWasShown:是不同的select器。

 NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWasShown:", name: UIKeyboardDidShowNotification, object: nil) 

请参阅下面的独立解决scheme:

 private func startObservingKeyboardEvents() { NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("keyboardWillShow:"), name:UIKeyboardWillShowNotification, object:nil) NSNotificationCenter.defaultCenter().addObserver(self, selector:Selector("keyboardWillHide:"), name:UIKeyboardWillHideNotification, object:nil) } private func stopObservingKeyboardEvents() { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) } func keyboardWillShow(notification: NSNotification) { if let userInfo = notification.userInfo { if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size { let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0); } } } func keyboardWillHide(notification: NSNotification) { let contentInset = UIEdgeInsetsZero; } 

使用contentInsetvariables来调整内容的插入。

就我而言,需要对上面的代码进行一些更改:

1 – 首先你需要在你的视图中放置一个滚动视图,并设置约束如下:

在这里输入图像说明

你的scrollView比视图更重要。

2 – 把你的TextField和你需要的其他组件。

3 – 使用@IBOutlet将ScrollView链接到ViewController

4 – 将委托添加到ScrollView:

 class ViewController: UIViewController, UITextFieldDelegate, UIScrollViewDelegate { ... 

5 – 添加观察者:

 override func viewWillAppear(animated: Bool) { self.startKeyboardObserver() } override func viewWillDisappear(animated: Bool) { self.stopKeyboardObserver() } private func startKeyboardObserver(){ NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillShow:", name: UIKeyboardWillShowNotification, object: nil) //WillShow and not Did ;) The View will run animated and smooth NSNotificationCenter.defaultCenter().addObserver(self, selector: "keyboardWillHide:", name: UIKeyboardWillHideNotification, object: nil) } private func stopKeyboardObserver() { NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillShowNotification, object: nil) NSNotificationCenter.defaultCenter().removeObserver(self, name: UIKeyboardWillHideNotification, object: nil) } 

6 – 添加要滚动的代码,计算KeyboardSize。

 func keyboardWillShow(notification: NSNotification) { if let userInfo = notification.userInfo { if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size { let contentInset = UIEdgeInsetsMake(0.0, 0.0, keyboardSize.height, 0.0); self.scrollView.contentInset = contentInset self.scrollView.scrollIndicatorInsets = contentInset self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, 0 + keyboardSize.height) //set zero instead self.scrollView.contentOffset.y } } } func keyboardWillHide(notification: NSNotification) { if let userInfo = notification.userInfo { if let keyboardSize: CGSize = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue().size { let contentInset = UIEdgeInsetsZero; self.scrollView.contentInset = contentInset self.scrollView.scrollIndicatorInsets = contentInset self.scrollView.contentOffset = CGPointMake(self.scrollView.contentOffset.x, self.scrollView.contentOffset.y) } } }