我知道有很多类似的解决方案,如TPKeyboardAvoiding , 苹果著名的解决方案 ,并提出各种建议,包括使用的UIScrollView的。 就我而言,我需要调整,以便适应键盘,而不是滚动或移动它。 该解决方案最接近我想要实现的,所以这是我的基础。 不过我有事情做在横向模式下工作的问题。 该调整大小,当键盘出现的观点我的方法是这样的:
- (void)keyboardWillShow:(NSNotification *)note {
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue];
CGRect keyboardFrame = [[self textField].superview convertRect:[[userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue] fromView:nil];
CGRect statusBarFrame = [[self textField].superview convertRect:[UIApplication sharedApplication].statusBarFrame fromView:nil];
CGRect bounds = [self textField].superview.bounds;
CGRect newFrame = CGRectMake(0.0, 0.0, bounds.size.width, keyboardFrame.origin.y + statusBarFrame.size.height);
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
[self textField].superview.frame = newFrame;
} completion:nil];
}
这工作完全处于纵向模式。
然而,在风景模式中,视图从左到右或从右到左,这取决于在哪个方向上装置旋转,而不是从底部向上调整大小。
很明显,有什么问题我如何使用坐标,以及一些参考帧是不是我认为这是在风景模式下,但我有一个时间赫克整理如何解决它。 我试过将各种事物与-convertRect:但没有我想是让我的任何地方。
我真的希望有人谁是所有这些矩形少困惑,以及他们如何改变时,方向的变化可以发现什么,我做错了,我需要做的就是这个权利是什么。 作为参考,我已经创建了一个项目显示,再现我有这个问题最简单的情况。
我劝你不要来调整根查看您的视图控制器,你可以创建内容查看并添加到视图视图控制器。 您可以更改此内容查看如下(我不使用autolayouting)尺寸:
- (void)keyboardWillShow:(NSNotification *)note {
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
CGRect keyboardFrameEnd = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd fromView:nil];
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
self.contentView.frame = CGRectMake(0, 0, keyboardFrameEnd.size.width, keyboardFrameEnd.origin.y);
} completion:nil];
}
- (void)keyboardWillHide:(NSNotification *)note {
NSDictionary *userInfo = note.userInfo;
NSTimeInterval duration = [userInfo[UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve curve = [userInfo[UIKeyboardAnimationCurveUserInfoKey] integerValue];
CGRect keyboardFrameEnd = [userInfo[UIKeyboardFrameEndUserInfoKey] CGRectValue];
keyboardFrameEnd = [self.view convertRect:keyboardFrameEnd fromView:nil];
[UIView animateWithDuration:duration delay:0 options:UIViewAnimationOptionBeginFromCurrentState | curve animations:^{
self.contentView.frame = CGRectMake(0, 0, keyboardFrameEnd.size.width, keyboardFrameEnd.origin.y);
} completion:nil];
}
维塔利B的答案迅速。 我有一个叫templateHeaderContentView视图,我创建了一个功能,并配置了看法高度那里。 你用你自己的看法,并改变高度相应那里。
func keyboardWillShow(notification: NSNotification) {
keyboardShowOrHide(notification)
}
func keyboardWillHide(notification: NSNotification) {
keyboardShowOrHide(notification)
}
private func keyboardShowOrHide(notification: NSNotification) {
guard let userInfo = notification.userInfo else {return}
guard let duration = userInfo[UIKeyboardAnimationDurationUserInfoKey]else { return }
guard let curve = userInfo[UIKeyboardAnimationCurveUserInfoKey] else { return }
guard let keyboardFrameEnd = userInfo[UIKeyboardFrameEndUserInfoKey] else { return }
let curveOption = UIViewAnimationOptions(rawValue: UInt(curve.integerValue << 16))
let keyboardFrameEndRectFromView = view.convertRect(keyboardFrameEnd.CGRectValue, fromView: nil)
UIView.animateWithDuration(duration.doubleValue ?? 1.0,
delay: 0,
options: [curveOption, .BeginFromCurrentState],
animations: { () -> Void in
self.templateHeaderContentView.configureView(keyboardFrameEndRectFromView.origin.y)
}, completion: nil)
}
覆盖非常好直形式马口:
https://developer.apple.com/library/ios/documentation/StringsTextFonts/Conceptual/TextAndWebiPhoneOS/KeyboardManagement/KeyboardManagement.html
我已经做了,希望这个代码将是有益的妳。
- (void)viewWillAppear:(BOOL)animated
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillShow:)
name:UIKeyboardWillShowNotification
object:nil];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(keyboardWillBeHidden:)
name:UIKeyboardWillHideNotification
object:nil];
}
- (void)keyboardWillShow:(NSNotification*)notification
{
[self moveControls:notification up:YES];
}
- (void)keyboardWillBeHidden:(NSNotification*)notification
{
[self moveControls:notification up:NO];
}
- (void)moveControls:(NSNotification*)notification up:(BOOL)up
{
NSDictionary* userInfo = [notification userInfo];
CGRect newFrame = [self getNewControlsFrame:userInfo up:up];
[self animateControls:userInfo withFrame:newFrame];
}
- (CGRect)getNewControlsFrame:(NSDictionary*)userInfo up:(BOOL)up
{
CGRect kbFrame = [[userInfo objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue];
kbFrame = [self.view convertRect:kbFrame fromView:nil];
CGRect newFrame = self.view.frame;
newFrame.origin.y += kbFrame.size.height * (up ? -1 : 1);
return newFrame;
}
- (void)animateControls:(NSDictionary*)userInfo withFrame:(CGRect)newFrame
{
NSTimeInterval duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
UIViewAnimationCurve animationCurve = [[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] integerValue];
[UIView animateWithDuration:duration
delay:0
options:animationOptionsWithCurve(animationCurve)
animations:^{
self.view.frame = newFrame;
}
completion:^(BOOL finished){}];
}
static inline UIViewAnimationOptions animationOptionsWithCurve(UIViewAnimationCurve curve)
{
return (UIViewAnimationOptions)curve << 16;
}
试试这个方法。 根据您的要求进行编辑。
#define kOFFSET_FOR_KEYBOARD 280.0
- (void)keyboardWillHide:(NSNotification *)notif {
[self setViewMoveUp:NO];
}
- (void)keyboardWillShow:(NSNotification *)notif{
[self setViewMoveUp:YES];
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
stayup = YES;
[self setViewMoveUp:YES];
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
stayup = NO;
[self setViewMoveUp:NO];
}
//method to move the view up/down whenever the keyboard is shown/dismissed
-(void)setViewMoveUp:(BOOL)moveUp
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:0.3]; // if you want to slide up the view
[UIView setAnimationBeginsFromCurrentState:YES];
CGRect rect = self.view.frame;
if (moveUp)
{
// 1. move the view's origin up so that the text field that will be hidden come above the keyboard
// 2. increase the size of the view so that the area behind the keyboard is covered up.
if (rect.origin.y == 0 ) {
rect.origin.y -= kOFFSET_FOR_KEYBOARD;
//rect.size.height += kOFFSET_FOR_KEYBOARD;
}
}
else
{
if (stayup == NO) {
rect.origin.y += kOFFSET_FOR_KEYBOARD;
//rect.size.height -= kOFFSET_FOR_KEYBOARD;
}
}
self.view.frame = rect;
[UIView commitAnimations];
}