2012-05-17 5 views
1

Когда я хочу поместить текст в свой UITextField, клавиатура показывает вверху и закрывает поле. Как предотвратить это? Я только что прочитал: this solution, но я понятия не имею, где изменить размер? Это хороший способ?Клавиатура скрывает поле ввода

Мой код:

UITextField * passwordTextField = [[[UITextField alloc] init] autorelease]; 
passwordTextField.keyboardType = UIKeyboardTypeDefault; 
passwordTextField.delegate = self; 
passwordTextField.placeholder = NSLocalizedString(@"somestr", @""); 
passwordTextField.secureTextEntry = YES; 
[_controls setObject:passwordTextField forKey:keyPassword]; 

И тогда я показать его в Three20 по:

[email protected]"", 
[NSArray arrayWithObjects: 
    [TTTableControlItem itemWithCaption:nil control:passwordTextField],   
    nil],... 
+0

Нет необходимости повторять теги вопроса в заголовке вопроса. – yoozer8

ответ

3

Вы просто должны реализовать делегаты от UITextField textFieldDidBeginEditing и textFieldDidEndEditing.Move рамку parentview вверх по некоторому значению, когда вызывается textFieldDidBeginEditing и восстанавливает его одним и тем же значением при вызове метода делегата textFieldDidEndEditing.

Другой способ - добавить наблюдателя для UIKeyboardDidShowNotification и переместить рамку вверх и сдвинуть фрейм вниз при запуске UIKeyboardDidHideNotification.

Пример: -

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardDidShow:)name:UIKeyboardDidShowNotification object:nil]; 

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWasHidden:) name:UIKeyboardDidHideNotification object:nil]; 

и изменить кадры в селекторов: -

- (void)keyboardDidShow:(NSNotification *)aNotification 
{  
if (keyBDidShow)   
return;  
NSTimeInterval animationDuration = 0.300000011920929;   
CGRect frame = self.view.frame;   
frame.origin.y -= 60;     
[UIView beginAnimations:@"Rollback" context:nil];   
[UIView setAnimationDuration:animationDuration];   
self.view.frame = frame;   
[UIView commitAnimations]; 
viewUp= YES;    
}  
keyBDidShow= YES; 
} 
- (void)keyboardWasHidden:(NSNotification *)aNotification 
{  
if (viewUp) 
{     
NSTimeInterval animationDuration = 0.300000011920929;   
CGRect frame = self.view.frame;   
frame.origin.y += 60;     
[UIView beginAnimations:@"Rollback" context:nil];   
[UIView setAnimationDuration:animationDuration];   
self.view.frame = frame;   
[UIView commitAnimations];   
viewUp = NO;  
}  
keyBDidShow= NO; 
} 

То же можно сделать бр для делегатов TextField.

-1

вы должны реализовать следующий метод

- (BOOL) textFieldShouldBeginEditing:(UITextField *)textField{ 
     [self adjustFramesWhenKeyoradIsShown]; 
    } 

в осуществлении вы должны повторной настройки TextField кадра. если у вас есть другие представления, которые вы хотите показать, а также не спрятанные на клавиатуре, вы также должны их перемещать. полезно иметь два метода, которые корректируют рамки для двух позиций (один, когда клавиатура отображается, и одна, когда она скрыта, поэтому, как только редактирование текстового поля будет отредактировано, вы вызываете другой метод в следующем методе делегирования текстового поля:

- (BOOL)textFieldShouldReturn:(UITextField *)textField { 
     [self adjustFramesWhenKeyoradIsHidden]; 
    } 

в этих двух методов, которые помогут вам изменить позицию кадров и изменить взгляды быть скрыты или нет, он будет выглядеть лучше, если вы анимировать их, что-то вроде этого:

- (void) adjustFramesWhenKeyoradIsShown{ 
      [UIView animateWithDuration:0.3 
         delay:0.0 
        options: UIViewAnimationCurveEaseOut 
       animations:^{ 
        logoArea.hidden = YES; 
        loginFieldsArea.frame = CGRectMake(0, 0, 320, 250); 
       } 
       completion:^(BOOL finished){ 
       }]; 
    } 
+0

Это только уменьшает мой взгляд, не двигается вверх по экрану и все еще покрывает – Kuba

+0

, какой вид становится меньше? не изменяйте размер любого фрейма, кроме источника .. поставьте правильные значения, и ничто не станет меньше. –

+0

@SimpleMan Я верю в это решение 'loginFieldsArea' - это subview с элементами управления, которые могут вызывать клавиатуру, что делает код в этом случае, перемещая рамку элементов управления на верхний край корневого представления. Самое простое, ничего необычное, трудно повторное использование и рефакторинг, но он работает, он быстро реализуется и довольно легко понимается (с соответствующими комментариями в коде). –

0

Resizing должен быть применен к Корневой взгляд: идея состоит в том, чтобы установить рамку представления в соответствии с видимой областью, уменьшенной на клавиатуре, в то время как первый ответчик все еще виден. TTBaseViewController свойства autoresizesForKeyboard и соответствующие методы

/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardWillAppear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardWillDisappear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 


/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardDidDisappear:(BOOL)animated withBounds:(CGRect)bounds { 
    // Empty default implementation. 
} 

Для табличных вам не нужно, чтобы изменить размер, см keyboardDidAppear реализацию TTTableViewController

/////////////////////////////////////////////////////////////////////////////////////////////////// 
- (void)keyboardDidAppear:(BOOL)animated withBounds:(CGRect)bounds { 
    [super keyboardDidAppear:animated withBounds:bounds]; 
    self.tableView.frame = TTRectContract(self.tableView.frame, 0, bounds.size.height); 
    [self.tableView scrollFirstResponderIntoView]; 
    [self layoutOverlayView]; 
    [self layoutBannerView]; 
} 
+0

Когда я вставляю это и реализую layoutOverlayView и методы layoutBannerView, когда клавиатура показывает, что все исчезает – Kuba

+0

@SimpleMan это внутренний метод 'TTTableViewController', я не думаю, что вам нужно переопределить его. Используя 'TTTableViewController', вам нужно установить' autoresizesForKeyboard' на 'YES', проверить' TableControlsTestController' из приложения 'TTCatalog', это так же просто, как подклассификация' TTTableViewController', в 'initWithNibName' вы устанавливаете' autoresizesForKeyboard' для 'YES' и заполнить' dataSource' элементами управления. 'keyboardDidAppear' будет вызываться автоматически и прокручивать таблицу до первого ответчика всякий раз, когда появляется клавиатура. Вы также можете установить 'TTCatalog', чтобы увидеть другие интересные функции. –

-2

лично я настоятельно рекомендую использовать TPKeyboardAvoiding Майкл Тайсон.

Это очень простой в использовании ... (цитирую из Read Me):

Для использования с UITableViewController классов, падение TPKeyboardAvoidingTableView.m и TPKeyboardAvoidingTableView.h в ваш проект и сделайте свой UITableView TPKeyboardAvoidingTableView в xib. Если вы не используете xib с вашим контроллером, я знаю нет простого способа сделать свой UITableView настраиваемым классом: путь наименьшего сопротивления - это создать xib для него.

Для нестандарт- UITableViewControllers, падение TPKeyboardAvoidingScrollView.m и TPKeyboardAvoidingScrollView.h исходных файлов в проект, поп UIScrollView в XIb вашего взгляда контроллера, установить класс мнения, скроллинга к TPKeyboardAvoidingScrollView, и поставить все ваши элементы управления в этом прокрутки. Вы также можете создавать его программно, без использования xib - просто используйте TPKeyboardAvoidingScrollView в качестве верхнего уровня .

Смежные вопросы