出现键盘时调整 UITextView 的大小
Resize the UITextView when keyboard appears
我想在出现键盘时调整文本视图的大小。我的代码如下。我启用了自动布局,因此使用来自 superview 的 textView->bottom space 的约束并通过 IBOutlet distanceFromBottom.
引用它
- (void)keyboardWillShow:(NSNotification *)notification
{
[UIView animateWithDuration:0.3 animations:^{
NSDictionary* d = [notification userInfo];
CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue];
r = [textView convertRect:r fromView:Nil];
if(IS_IPHONE_6||IS_IPHONE_6P)
distanceFromBottom.constant = r.origin.y+78;
else if(IS_IPHONE_5)
distanceFromBottom.constant = r.origin.y+183;
}];
}
上面的代码运行完美。我不明白的是为什么我需要为 iPhone6 添加 +78 或为 iPhone5 添加 183。这两个值是我通过反复试验得出的。如果我不添加这些,textView 会延伸到键盘下方。请帮我解开这个谜。
在viewWillAppear
方法中,添加以下内容:
- (void) viewWillAppear:(BOOL)paramAnimated{
[super viewWillAppear:paramAnimated];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleKeyboardDidShow:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification object:nil];
}
然后实现通知中心的两个方法,像这样:
- (void) handleKeyboardDidShow:(NSNotification *)paramNotification{
NSValue *keyboardRectAsObject =
[[paramNotification userInfo]
objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = CGRectZero;
[keyboardRectAsObject getValue:&keyboardRect];
yourTextView.contentInset =
UIEdgeInsetsMake(0.0f,
0.0f,
keyboardRect.size.height,
0.0f);
}
另一个喜欢:
- (void) handleKeyboardWillHide:(NSNotification *)paramNotification{
yourTextView.contentInset = UIEdgeInsetsZero;
}
它将适用于所有设备 ;)
Swift / 修改版本
利用上面的内容,我做了一些调整,以在键盘显示和隐藏时使用NSLayoutConstraint
改变高度constant
属性。如果您旋转设备,这也有效。
1.设置 TextView 约束
然后控制从您的高度限制拖动出口到 class。
2。添加以下内容
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(SkillDescriptionViewController.keyboardWillShowHandle(_:)), name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(SkillDescriptionViewController.keyboardWillHideHandle), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShowHandle(note:NSNotification) {
guard let keyboardRect = note.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
let kbFrame = keyboardRect.CGRectValue()
tvHeight.constant = -kbFrame.height
view.layoutIfNeeded()
}
func keyboardWillHideHandle() {
tvHeight.constant = 0
view.layoutIfNeeded()
}
Swift 5 解决方案基于上述答案
通知 API 已更改 (20190707) 以及如何使用 #selector
当键盘弹出覆盖UITextView导致用户看不到被编辑的文本时,可以使用这里的解决方案。
import UIKit
class DCNodeLogEntryViewController: UIViewController {
@IBOutlet weak var textViewNodeLogEntry: UITextView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(
self,
selector: #selector(DCNodeLogEntryViewController.handleKeyboardDidShow(notification:)),
name: UIResponder.keyboardDidShowNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(DCNodeLogEntryViewController.handleKeybolardWillHide),
name: UIResponder.keyboardWillHideNotification,
object: nil
)
}
@objc func handleKeyboardDidShow(notification: NSNotification) {
guard let keyboardRect = notification
.userInfo![UIResponder.keyboardFrameEndUserInfoKey]
as? NSValue else { return }
let frameKeyboard = keyboardRect.cgRectValue
textViewNodeLogEntry.contentInset = UIEdgeInsets(
top: 0.0,
left: 0.0,
bottom: frameKeyboard.size.height,
right: 0.0
)
view.layoutIfNeeded()
}
@objc func handleKeybolardWillHide() {
textViewNodeLogEntry.contentInset = .zero
}
}
我想在出现键盘时调整文本视图的大小。我的代码如下。我启用了自动布局,因此使用来自 superview 的 textView->bottom space 的约束并通过 IBOutlet distanceFromBottom.
引用它- (void)keyboardWillShow:(NSNotification *)notification
{
[UIView animateWithDuration:0.3 animations:^{
NSDictionary* d = [notification userInfo];
CGRect r = [d[UIKeyboardFrameEndUserInfoKey] CGRectValue];
r = [textView convertRect:r fromView:Nil];
if(IS_IPHONE_6||IS_IPHONE_6P)
distanceFromBottom.constant = r.origin.y+78;
else if(IS_IPHONE_5)
distanceFromBottom.constant = r.origin.y+183;
}];
}
上面的代码运行完美。我不明白的是为什么我需要为 iPhone6 添加 +78 或为 iPhone5 添加 183。这两个值是我通过反复试验得出的。如果我不添加这些,textView 会延伸到键盘下方。请帮我解开这个谜。
在viewWillAppear
方法中,添加以下内容:
- (void) viewWillAppear:(BOOL)paramAnimated{
[super viewWillAppear:paramAnimated];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleKeyboardDidShow:)
name:UIKeyboardDidShowNotification object:nil];
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(handleKeyboardWillHide:)
name:UIKeyboardWillHideNotification object:nil];
}
然后实现通知中心的两个方法,像这样:
- (void) handleKeyboardDidShow:(NSNotification *)paramNotification{
NSValue *keyboardRectAsObject =
[[paramNotification userInfo]
objectForKey:UIKeyboardFrameEndUserInfoKey];
CGRect keyboardRect = CGRectZero;
[keyboardRectAsObject getValue:&keyboardRect];
yourTextView.contentInset =
UIEdgeInsetsMake(0.0f,
0.0f,
keyboardRect.size.height,
0.0f);
}
另一个喜欢:
- (void) handleKeyboardWillHide:(NSNotification *)paramNotification{
yourTextView.contentInset = UIEdgeInsetsZero;
}
它将适用于所有设备 ;)
Swift / 修改版本
利用上面的内容,我做了一些调整,以在键盘显示和隐藏时使用NSLayoutConstraint
改变高度constant
属性。如果您旋转设备,这也有效。
1.设置 TextView 约束
然后控制从您的高度限制拖动出口到 class。
2。添加以下内容
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(SkillDescriptionViewController.keyboardWillShowHandle(_:)), name: UIKeyboardDidShowNotification, object: nil)
NSNotificationCenter.defaultCenter().addObserver(self, selector:#selector(SkillDescriptionViewController.keyboardWillHideHandle), name: UIKeyboardWillHideNotification, object: nil)
}
func keyboardWillShowHandle(note:NSNotification) {
guard let keyboardRect = note.userInfo![UIKeyboardFrameEndUserInfoKey] as? NSValue else { return }
let kbFrame = keyboardRect.CGRectValue()
tvHeight.constant = -kbFrame.height
view.layoutIfNeeded()
}
func keyboardWillHideHandle() {
tvHeight.constant = 0
view.layoutIfNeeded()
}
Swift 5 解决方案基于上述答案
通知 API 已更改 (20190707) 以及如何使用 #selector
当键盘弹出覆盖UITextView导致用户看不到被编辑的文本时,可以使用这里的解决方案。
import UIKit
class DCNodeLogEntryViewController: UIViewController {
@IBOutlet weak var textViewNodeLogEntry: UITextView!
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
NotificationCenter.default.addObserver(
self,
selector: #selector(DCNodeLogEntryViewController.handleKeyboardDidShow(notification:)),
name: UIResponder.keyboardDidShowNotification,
object: nil
)
NotificationCenter.default.addObserver(
self,
selector: #selector(DCNodeLogEntryViewController.handleKeybolardWillHide),
name: UIResponder.keyboardWillHideNotification,
object: nil
)
}
@objc func handleKeyboardDidShow(notification: NSNotification) {
guard let keyboardRect = notification
.userInfo![UIResponder.keyboardFrameEndUserInfoKey]
as? NSValue else { return }
let frameKeyboard = keyboardRect.cgRectValue
textViewNodeLogEntry.contentInset = UIEdgeInsets(
top: 0.0,
left: 0.0,
bottom: frameKeyboard.size.height,
right: 0.0
)
view.layoutIfNeeded()
}
@objc func handleKeybolardWillHide() {
textViewNodeLogEntry.contentInset = .zero
}
}