首先,对于某些情况,我在这里尝试完成的是键盘出现时键盘上方会显示UIToolbar
。以下是当前场景的设置:
注意#1:UINavigationController应该在这张照片中标记为UIViewController
注意#2 UIToolbar
已通过UIViewController
Storyboards
动画在我第一次调用我的动画功能时不会移动UIToolbar。
当发生键盘时,我的-moveTextViewToolbarOnScreen
功能设置为触发。动画运行,^completion
处理程序触发,只有UIToolbar
根本不动。因此,作为临时解决方法,我在动画的^completion
块中有一行代码,用于检查我的frame.y
的{{1}}是否实际上应该在哪里(动画目的地),如果没有,再次调用动画功能。 这里的谜团是,为了让动画实际将UIToolbar
移动到位,函数总是需要调用两次。
这是我的动画功能(注意完成块中的UIToolbar
语句):
if()
在屏幕外移动-(void)moveTextViewToolbarOnScreen{
if (self.textViewToolbar.hidden) {
self.textViewToolbar.hidden = NO;
self.textViewToolbar.userInteractionEnabled = YES;
}
[UIView
animateWithDuration:0.26f
delay:0.0f
options:UIViewAnimationOptionCurveEaseInOut
animations:^{
self.textViewToolbar.alpha = 1.0;
self.textViewToolbar.frame = self.textViewKeyboardToolbarOnScreenFrame;
} completion:^(BOOL finished) {
// TODO: Figure out why this workaround is necessary. Sometimes the _keyboardToolbar doesn't
// animate into place the first time and needs this recursive push.
if (self.textViewToolbar.frame.origin.y != self.textViewKeyboardToolbarOnScreenFrame.origin.y){
[self moveTextViewToolbarOnScreen];
}
}];
}
非常简单:
UIToolbar
作为参考,这是我的动画目的地-(void)moveTextViewToolbarOffScreen{
[UIView
animateWithDuration:0.3f
delay:0.0f
options:UIViewAnimationOptionCurveLinear
animations:^{
self.textViewToolbar.alpha = 0.0;
self.textViewToolbar.frame = self.textViewKeyboardToolbarOnScreenFrame;
} completion:^(BOOL finished) {
}];
}
:
self.textViewKeyboardToolbarOnScreenFrame
当键盘显示/隐藏它时,动画设置为:
// 260 = keyboard height
self.textViewKeyboardToolbarOnScreenFrame =
CGRectMake(0,
screenHeight - 260,
keyboardToolBarWidth,
keyboardToolBarHeight
);
所以任何人都可以帮助我理解为什么我的// textEditKeyboardAppear listener
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
// textEditKeyboardDisappear listener
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(keyboardWillHide:)
name:UIKeyboardWillHideNotification
object:nil];
-(void)keyboardWillShow:(NSNotification *)notifcation {
NSLog(@"keyboardWillShow");
[self moveTextViewToolbarOnScreen];
}
-(void)keyboardWillHide:(NSNotification *)notifcation {
NSLog(@"keyboardWillHide");
[self moveTextViewToolbarOffScreen];
}
第一次不会动画到位,需要额外(递归)调用我的UIToolbar
函数?
任何想法?我很难过!
注意:早些时候我遇到了一个问题,-moveTextViewToolbarOffScreen
按钮在UIToolbar
最终动画完成后无法工作,但是一旦我意识到,我就解决了这个问题我只是用另一个UIToolbar
框剪裁工具栏视图,并阻止按钮接收任何点击事件。