我想在键盘出现时调整textview的高度。在iOS 7中,这可以通过调整视图控制器的textview和bottomLayoutGuide之间的NSLayoutConstraint来完成。
除了一个细节之外,下面的代码可以正常工作。在动画期间,textview在键盘之前运行并且出现大的间隙。在keyboardWillHide方法中类似。
这个"错误的原因"可能是因为键盘从屏幕的最底部开始,而textview由于工具栏的高度而开始更高。
有关如何解决此问题的任何建议?
-(void) keyboardWillShow:(NSNotification *) notification
{
//update constraints
CGRect keyboardFrame = [[[notification userInfo] valueForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue];
CGRect convertedKeyboardFrame = [[self view] convertRect:keyboardFrame
fromView:nil];
CGRect toolbarFrame = [[[self navigationController] toolbar] frame];
CGRect convertedToolbarFrame = [[self view] convertRect:toolbarFrame
fromView:nil];
CGFloat toolbarAdjustment = (UIInterfaceOrientationIsPortrait([self interfaceOrientation])) ? CGRectGetHeight(convertedToolbarFrame) :CGRectGetWidth(convertedToolbarFrame);
[[_textView bottomSpaceConstraint] setConstant:CGRectGetHeight(convertedKeyboardFrame) - toolbarAdjustment];
//animate change
for (UIView *view in [[self view] subviews])
{
[view setNeedsUpdateConstraints];
}
[UIView animateWithDuration:[[[notification userInfo] valueForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]
delay:0 //0.2 as possible hack, otherwise a gap appears between keyboard and textview
options:[[[notification userInfo] valueForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue]
animations:^{
for (UIView *view in [[self view] subviews])
{
[view layoutIfNeeded];
}
}
completion:NULL];
}
答案 0 :(得分:1)
延迟可能是由于在循环中反复调用layoutIfNeeded
引起的。
在动画块中,只需将layoutIfNeeded
发送到根视图,即self.view
。将layoutIfNeeded
发送到根视图将处理整个视图层次结构。所以摆脱循环。
我怀疑是否有必要调用setNeedsUpdateConstraints
;如果是,则只需将其发送到根视图。
另外,请尝试删除动画选项参数
options:0