我有一个UIScrollView
基本上看起来像 Messages.app 的 iOS 应用程序:屏幕上的内容和底部的文本视图和添加更多内容的按钮。当键盘出现时,文本视图和按钮正确向上移动。
我已设置keyboardDismissMode
为向下拖动键盘使其消失,但在拖动过程中,随着键盘向下移动,如何更新我的视图在屏幕上的位置以保持连接?似乎在此过程中不会触发键盘将更改帧通知。
这样做的“正确”方式是什么?
编辑:我有一种预感,使用输入视图/附件视图可能是可行的,但不确定这是正确的方向。
我有一个UIScrollView
基本上看起来像 Messages.app 的 iOS 应用程序:屏幕上的内容和底部的文本视图和添加更多内容的按钮。当键盘出现时,文本视图和按钮正确向上移动。
我已设置keyboardDismissMode
为向下拖动键盘使其消失,但在拖动过程中,随着键盘向下移动,如何更新我的视图在屏幕上的位置以保持连接?似乎在此过程中不会触发键盘将更改帧通知。
这样做的“正确”方式是什么?
编辑:我有一种预感,使用输入视图/附件视图可能是可行的,但不确定这是正确的方向。
很确定这种行为需要 SPI。但是:您可以遍历视图/窗口层次结构,找到键盘窗口,然后对其应用变换以在交互过程中移动它。( window.transform= )
但是,不确定当您的交互结束时该怎么做——也许手动动画键盘离开(使用上述技术)以完成键盘隐藏,然后当它被隐藏时,在没有动画的情况下辞去第一响应者。
编辑:
抱歉,我以为你想移动键盘,但如果你想观察键盘的位置,你可以使用 KVO(正如@KudoCC 建议的那样)
static void * __keyboardCenterKVOContext = & __keyboardCenterKVOContext ;
-(void)setUpKeyboardObserver
{
UIView * keyboardView = ...?
[ keyboardView addObserver:self forKeyPath:@"center" options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionInitial context:__keyboardCenterKVOContext ] ;
}
然后实现 KVO 观察者:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
if ( context == __keyboardCenterKVOContext )
{
CGPoint newKeyboardCenter = [ [ change valueForKey:NSKeyValueChangeNewKey ] pointValue ] ;
// .. handle new keyboard position here ...
}
else
{
[ super observeValueForKeyPath:keyPath ofObject:object change:change context:context ] ;
}
}
每次键盘视图更改其中心属性时,都会运行您的 KVO 观察器。您也可以尝试观察键盘窗口frame
和/或transform
属性。
我有一些代码可以帮助在这里观察 KVO,这可能会对您有所帮助:https ://gist.github.com/nielsbot/6873377
(您可能想要使用我的帮助代码的原因是因为它会自动从正在释放的对象中删除 KVO 观察。这需要一些运行时摆弄,但在您的情况下,您并不真正知道键盘窗口何时会被释放。虽然也许你可以在你的 keyboardWillHide 处理程序中拆除 KVO)
当键盘消失并出现时,您可以尝试通知移动您的内容:
NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
[center addObserver:self selector:@selector(keyboardDisappeared) name:UIKeyboardWillHideNotification object:nil];
[center addObserver:self selector:@selector(keyboardAppeared) name:UIKeyboardWillShowNotification object:nil];
-(void) keyboardDisappeared
{
[UIView animateWithDuration:1.0 delay:0 options:yourAnimationOption animations:^
{
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y+100(same as you do in keyboardAppeared), self.view.frame.size.width, self.view.frame.size.height);
} completion::^(BOOL finished)
{
}];
}
-(void) keyboardAppeared
{
[UIView animateWithDuration:1.0 delay:0 options:yourAnimationOption animations:^
{
self.view.frame = CGRectMake(self.view.frame.origin.x, self.view.frame.origin.y-(as much you want), self.view.frame.size.width, self.view.frame.size.height);
} completion::^(BOOL finished)
{
}];
}