我有一个UIViewCOntroller包含一个UITextView.当键盘出现时我按如下方式调整大小:
#pragma mark - Responding to keyboard events
- (void)keyboardDidShow:(NSNotification *)notification
{
NSDictionary* info = [notification userInfo];
CGRect keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect newTextViewFrame = self.textView.frame;
newTextViewFrame.size.height -= keyboardSize.size.height + 70;
self.textView.frame = newTextViewFrame;
self.textView.backgroundColor = [UIColor yellowColor];
}
- (void)keyboardWillHide:(NSNotification *)notification
{
NSDictionary* info = [notification userInfo];
CGRect keyboardSize = [[info objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect newTextViewFrame = self.textView.frame;
newTextViewFrame.size.height += keyboardSize.size.height - 70;
self.textView.frame = newTextViewFrame;
}
Run Code Online (Sandbox Code Playgroud)
textView似乎重新调整到合适的大小,但是当用户键入光标时,最终会在textView框架的"外部".见下图:

黄色区域是UITextView框架(我不知道R键旁边的蓝线是什么).我发现这很有线.如果这有任何区别,我正在使用iOS7.
任何想法或提示?
更新
我有一个UITextView子类,使用以下方法绘制水平线(如果这有任何区别):
- …Run Code Online (Sandbox Code Playgroud) 所以我已经设置了键盘外观事件的通知.现在让我们考虑一个UITextView和一个UITextField.
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
Run Code Online (Sandbox Code Playgroud)
选择器是:
- (void)keyboardWillShow:(NSNotification *)notification {
keyboardSize = [[[notification userInfo] objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
}
Run Code Online (Sandbox Code Playgroud)
在一个UITextView的情况下,所述委托方法- (void)textViewDidBeginEditing:(UITextView *)textView烧制后的keyboardWillShow:方法.所以keyboardSize有键盘的实际大小,我可以在textview委托方法中使用它.
然而,在一个的UITextField的情况下,相应的委托方法- (void)textFieldDidBeginEditing:(UITextField *)textField进行烧制之前的keyboardWillShow:方法.
为什么会这样?如何CGSize在textfield的情况下获得键盘,因为它现在只返回零,因为首先调用textfield委托而不是键盘选择器.
当我开始编辑UITextField时,我选中了"编辑开始时清除"选项,因此它开始时没有文本.但是,在您键入至少一个字符之前,"返回"按钮将显示为灰色.
我见过其他iphone应用程序,其中"返回"按钮没有变灰(如果你按下它没有文字,那么它会回到以前的文本).这是怎么做到的?
谢谢.
基本上我想让用户点击文本字段,它会显示一个填充的选择器视图而不是键盘.这也需要一个带有完成按钮的工具栏以及Im假设.我目前将字段设置为输出和操作,而不是更多.我还有一个代码中的动作表,用于当用户提交内容时,如果这对于可能使用动作表也有任何不同.
我尝试研究这个主题,但99%的主题是使用datepickers而不是pickerviews(或非常旧的代码).
这是一张图片,供参考.

我正在使用UIKeyboardWillShowNotification和UIKeyboardWillHideNotification动画沿键盘显示动画使用UIKeyboardAnimationDurationUserInfoKey,UIKeyboardAnimationCurveUserInfoKey和UIKeyboardFrameEndUserInfoKey.
一切正常,只要元素开始位置在屏幕的底部.我的元素(在截图输入框)开始的UITabBarController以上,所以如果我的动画开始有键盘的UITextField,沿着动画缩小,直到它到达其终点之间的差距.
什么我真的寻找是这样的:"制作具有相同的动画曲线,但开始移动,如果键盘达到我的美星的位置".
如果我想补充的延迟启动动画它不会与宽松正确的,这可能会在未来的iOS版本打破.
如果你与我分享你的想法会很棒.:-)

所以我有一个具有聊天部分的应用程序,我正在同步键盘的动画隐藏和显示聊天输入的上升和下降.
这是我正在使用的代码:
节目:
- (void) keyboardWillShow:(NSNotification *)note {
NSDictionary *keyboardAnimationDetail = [note userInfo];
UIViewAnimationCurve animationCurve = [keyboardAnimationDetail[UIKeyboardAnimationCurveUserInfoKey] integerValue];
CGFloat duration = [keyboardAnimationDetail[UIKeyboardAnimationDurationUserInfoKey] floatValue];
NSValue* keyboardFrameBegin = [keyboardAnimationDetail valueForKey:UIKeyboardFrameBeginUserInfoKey];
CGRect keyboardFrameBeginRect = [keyboardFrameBegin CGRectValue];
// working for hardware keyboard
//UIViewAnimationOptions options = (UIViewAnimationOptions)animationCurve;
// working for virtual keyboard
UIViewAnimationOptions options = (animationCurve << 16);
[UIView animateWithDuration:duration delay:0.0 options:options animations:^{
textView.frame = CGRectMake(0, self.view.bounds.size.height - keyboardFrameBeginRect.size.height, self.view.bounds.size.width, -40);
} completion:nil];
}
Run Code Online (Sandbox Code Playgroud)
隐藏:
- (void) keyboardWillHide:(NSNotification *)note {
NSDictionary *keyboardAnimationDetail = [note …Run Code Online (Sandbox Code Playgroud) 我试图在键盘出现/更改时在键盘上方移动UITextView.假设我显示英文键盘,然后直接切换到中文键盘(比标准英文键盘高).在这种情况下,我的文本视图总是显得太高(肉眼看来,文本视图被中文键盘"输入附件视图"的大小错误地偏移.我发布的图片却缺乏声誉所以:)).当我的应用程序收到UIKeyboardDidShowNotification(使用UIKeyboardFrameEndUserInfoKey获取高度)时,我正在调整文本视图位置,经过一些调查后,UIKeyboardDidShowNotification被多次调用,通常是键盘尺寸不正确(我已经NSLogged了userInfo字典).我在ViewWillAppear中注册我的键盘通知,并在ViewWillDisappear中取消注册.我无法确定导致此通知多次触发的原因; 我的理解是,只有在键盘完成显示后才会触发此通知一次.另外需要注意:我在响应UIKeyboardDidShowNotification的方法中使用了NSLogged"self",它实际上始终是相同的View Controller对象.
但是,即使多次触发此通知,我仍然不明白为什么某些通知的键盘高度会有所不同.其中一个通知始终具有正确的高度,但是当它不是最后一个通知时,文本视图最终会出现在错误的位置.任何有关如何进一步排除故障的见解将非常感激!
编辑:我测试的越多,特别是中文键盘的问题就越多.每当我将键盘从英文切换到中文时,我得到三个UIKeyboardWillShowNotifications:
2014-12-24 22:49:29.385 Example[1055:421943] info dictionary: {
UIKeyboardAnimationCurveUserInfoKey = 0;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 252}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 460}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 442}";
UIKeyboardFrameBeginUserInfoKey = "NSRect: {{0, 352}, {320, 216}}";
UIKeyboardFrameEndUserInfoKey = "NSRect: {{0, 316}, {320, 252}}";
}
2014-12-24 22:49:29.408 Example[1055:421943] info dictionary: {
UIKeyboardAnimationCurveUserInfoKey = 0;
UIKeyboardAnimationDurationUserInfoKey = 0;
UIKeyboardBoundsUserInfoKey = "NSRect: {{0, 0}, {320, 216}}";
UIKeyboardCenterBeginUserInfoKey = "NSPoint: {160, 442}";
UIKeyboardCenterEndUserInfoKey = "NSPoint: {160, 460}"; …Run Code Online (Sandbox Code Playgroud) 看来键盘不必占用整个屏幕,请查看我帖子的问题栏中的UPDATE.谢谢.
使用UITextField在屏幕上放置全屏键盘.
我已经设置了一个UISplitViewController,我希望RootViewController(又名MasterViewController)有UITextField键盘显示.然后我想在右边搜索结果(在"ResultViewController"(UIViewController)中).
这个想法是当用户输入时,提出结果.
我首先添加了一个UITextField到我的RootViewController通道,storyboard但是当我通过激活键盘时占用了整个屏幕textField.becomeFirstResponder().
我想如果我使用了UIAlertController这个问题,但是键盘仍然会占据整个屏幕.
class RootViewController: UIViewController {
override func viewDidLoad() {
let alertController = UIAlertController(title: "Search", message: "Search for something!.", preferredStyle: UIAlertControllerStyle.Alert)
alertController.addTextFieldWithConfigurationHandler({(textField: UITextField!) in
textField.placeholder = "Search"
})
self.addChildViewController(alertController)
alertController.view.frame = self.view.frame
self.view.addSubview(alertController.view)
}
}
Run Code Online (Sandbox Code Playgroud)
使用UISplitViewController时我怎样才能让键盘只停留在其中RootViewController并且不占用整个屏幕?
更新:看来这已在新苹果电视上的Netflix应用程序中实现.键盘位于顶部,占据整个宽度.底部分为两部分.左侧是建议的单词结果,右侧是可能视频的视频封面的集合视图.一切都在用户输入时更新.
如果这被认为是Apple TV的糟糕设计,那么请随时指出原因.
这就是我目前得到的.文本框打开一个占据整个屏幕的键盘.
我已经看到了这一点,但是不记得在按下返回键时,通过界面构建器正确使用了什么Jedi技术来解除uikeboard.谁知道怎么做?
请不要发布关于使用UITextFieldDelegate的信息,我知道这个方法,我只对强制键盘在返回键被击中而没有任何额外的逻辑或协议构造感到兴趣.
有没有办法检测用户何时更改键盘类型,特别是在这种情况下更改为表情符号键盘?
uikeyboard ×10
ios ×7
objective-c ×4
uitextfield ×3
animation ×2
cocoa-touch ×2
iphone ×2
uitextview ×2
emoji ×1
ios5 ×1
swift ×1
tvos ×1
uipickerview ×1