it-swarm.com.ru

Отключить клавиатуру, прикоснувшись к фону UITableView

У меня есть UITableView с UITextFields в качестве ячеек. Я хотел бы отклонить клавиатуру, когда задан фон UITableView. Я пытаюсь сделать это, создав UIButton размер UITableView и поместив его позади UITableView. Единственная проблема заключается в том, что UIButton перехватывает все касания, даже когда касание находится на UITableView. Что я делаю неправильно?

Спасибо!

97
Hua-Ying

Это легко сделать, создав объект UITapGestureRecognizer (по умолчанию это обнаружит «жест» в одно касание, поэтому дальнейшая настройка не требуется), указав цель/действие для запуска жеста, а затем прикрепив объект распознавания жестов в вашем табличном представлении.

Например. Возможно, в вашем методе viewDidLoad:

UITapGestureRecognizer *gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
[self.tableView addGestureRecognizer:gestureRecognizer];

И метод hideKeyboard может выглядеть так:

- (void) hideKeyboard {
    [textField1 resignFirstResponder];
    [textField2 resignFirstResponder];
    ...
    ...
}

Обратите внимание, что жест не срабатывает при касании внутри объекта UITextField. Он запускается на фоне UITableView, в представлении нижнего колонтитула, в представлении заголовка и на UILabels внутри ячеек и т.д.

197
mixja

Решение UITapGestureRecognizer работает с выбором ячеек таблицы, если вы установите:

gestureRecognizer.cancelsTouchesInView = NO;
123
Azbuky

Вот лучший способ сделать это ... Просто сделайте это

[self.view endEditing:YES];

или же 

[[self.tableView superView] endEditing:YES];
61
Saad

Вы также можете сделать это из раскадровки:  enter image description here

50
Ben

Поскольку UITableView является подклассом UIScrollView, реализация одного метода делегата, представленного ниже, обеспечивает чрезвычайно простое и быстрое решение. Нет необходимости даже привлекать resignFirstResponder, поскольку просмотр иерархии анализирует и находит текущего респондента и просит его оставить свой статус респондента. 

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}

И не забудьте добавить UIScrollViewDelegate в заголовочный файл. 

22
Rajive Jain

Во-первых, прослушайте scrollViewWillBeginDragging в вашем UIViewController, добавив UIScrollViewDelegate:

В .h файле:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

В .m файле:

- (void)scrollViewWillBeginDragging:(UIScrollView *)activeScrollView {

    [self dismissKeyboard];

}

Тогда слушайте другие взаимодействия:

- (void)setupKeyboardDismissTaps {

    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UISwipeGestureRecognizer *swipeDownGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeDownGestureRecognizer.cancelsTouchesInView = NO;
    swipeDownGestureRecognizer.direction = UISwipeGestureRecognizerDirectionDown;
    [self.tableView addGestureRecognizer:swipeDownGestureRecognizer];

    UISwipeGestureRecognizer *swipeLeftGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeLeftGestureRecognizer.cancelsTouchesInView = NO;
    swipeLeftGestureRecognizer.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.tableView addGestureRecognizer:swipeLeftGestureRecognizer];

    UISwipeGestureRecognizer *swipeRightGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    swipeRightGestureRecognizer.cancelsTouchesInView = NO;
    swipeRightGestureRecognizer.direction = UISwipeGestureRecognizerDirectionRight;
    [self.tableView addGestureRecognizer:swipeRightGestureRecognizer];


    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)];
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

Затем реализуйте dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}

И если, как и я, вы хотите отклонить клавиатуру для UITextField внутри ячейки таблицы:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    CustomCellClass *customCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]];
    [customCell.textFieldInCell resignFirstResponder]; 

}

Надеюсь, что это поможет любому в поиске!

12
bbeckford
tableView.keyboardDismissMode = .onDrag
9
Dom Bryan

Вот версия Swift для вашего удовольствия от кодирования:

Он добавляет распознаватель жестов касания, а затем закрывает клавиатуру. Нет выхода для TextField не требуется!

override func viewDidLoad() {
    super.viewDidLoad()
    view.addGestureRecognizer(UITapGestureRecognizer(target: self, action: "handleTap:"))
}

func handleTap(sender: UITapGestureRecognizer) {
    if sender.state == .Ended {
        view.endEditing(true)
    }
    sender.cancelsTouchesInView = false
}
7
Biodave

Я сделал это так:

Создайте метод в вашем TableViewController для деактивации первого респондента (который будет вашим TextBox на этом этапе)

- (BOOL)findAndResignFirstResonder:(UIView *)stView {
    if (stView.isFirstResponder) {
        [stView resignFirstResponder];
        return YES;     
    }

    for (UIView *subView in stView.subviews) {
        if ([self findAndResignFirstResonder:subView]) {
            return YES;
        }
    }
    return NO;
}

В tableView:didSelectRowAtIndexPath: вызов предыдущего метода:

- (void)tableView:(UITableView *)tableView
                             didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    ...
    [self findAndResignFirstResonder: self.view];
    ...
}
7
sha

У меня была UITableViewController, и реализация touchesBegan:withEvent: у меня не сработала. 

Вот что сработало:

Swift: 

override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    view.endEditing(true)
}

Objective-C:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    [self.view endEditing:YES];
}
5
MontiRabbit

Существует версия Swift 3 без блокирования нажатий на ячейки.

В методе viewDidLoad():

let dismissKeyboardGesture = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
dismissKeyboardGesture.cancelsTouchesInView = false
tableView.addGestureRecognizer(dismissKeyboardGesture)

И hideKeyboard выглядит так:

func hideKeyboard() {
    view.endEditing(true)
}
4
Ivan Smetanin

Если вы ориентируетесь на iOS7, вы можете использовать одно из следующих:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Первый будет анимировать экранную клавиатуру при прокрутке таблицы, а второй скрывает клавиатуру, как приложение «Сообщения».

Обратите внимание, что они из UIScrollView, от которого наследуется UITableView.

4
Joe Masilotti
@interface DismissableUITableView : UITableView {
}
@end

@implementation DismissableUITableView

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {
 [self.superview endEditing:YES];
 [super touchesBegan:touches withEvent:event];
}

@end

Затем убедитесь, что в вашем Nib-файле вы установили тип вашего UITableView равным DismissableUITableView ..... возможно, я мог бы придумать лучшее имя для этого класса, но вы поняли.

4
bandejapaisa

UITableView является подклассом UIScrollView. 

Я сделал так, чтобы прослушать событие прокрутки пользователем, а затем resignFirstResponder. Вот метод UIScrollViewDelegate для реализации в вашем коде;

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

При рассмотрении подобных проблем я обнаружил, что наилучшим способом является исследование протоколов делегатов для каждого объекта и родительских классов (в данном случае UITableViewDelegate, UIScrollViewDelegate. Количество срабатываний объектов NS достаточно велико). и всеобъемлющим. Кроме того, легче реализовать протокол, чем создавать подклассы.

2
pschang

У меня была та же проблема, и вот мое решение, оно отлично работает для меня:

В представлении или представлении контроллера, который вы реализовали <UITextFieldDelegate>

(В моем случае у меня есть пользовательская UITableViewCell с именем TextFieldCell), 

Объявите UITapGestureRecognizer как свойство:

@interface TextFieldCell : UITableViewCell <UITextFieldDelegate>
{
    UITextField *theTextField;
    UITapGestureRecognizer *gestureRecognizer;
}
@property (nonatomic,retain) UITextField *theTextField;
@property (nonatomic,retain) UITapGestureRecognizer *gestureRecognizer; 

И инициализируйте его в вашем представлении/контроллере:

self.gestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(closeKeyboard:)];

В методе - (void)textFieldDidBeginEditing:(UITextField *)textField используйте superView для перехода к вашему tableView и вызовите addGestureRecognizer

[self.superview.superview addGestureRecognizer:gestureRecognizer];

А в - (void)textFieldDidEndEditing:(UITextField *)textField просто удалите распознаватель жестов:

[self.superview.superview removeGestureRecognizer:gestureRecognizer];

Надеюсь, поможет.

2
hac.jack

Я хотел, чтобы моя ячейка открывала клавиатуру, когда была выделена какая-либо часть ячейки, и закрывала ее, если щелкнуть где-нибудь вне ячейки. Чтобы открыть клавиатуру:

- (void)setSelected:(BOOL)selected animated:(BOOL)animated
{
    [super setSelected:selected animated:animated];
    if (selected)
    {
        [self.textField becomeFirstResponder];
    }
}

(ПРИМЕЧАНИЕ. Я вложил ячейку в подкласс, но вы легко можете добиться этого с помощью метода tableView:didSelectRowAtIndexPath: делегата UITableView)

Это означало, что при верхних решениях, если дважды щелкнуть ячейку, клавиатура трясется, как, во-первых, распознаватель жестов попытался закрыть клавиатуру, а во-вторых, ячейка была повторно выбрана и попыталась открыть клавиатуру.

Решение состоит в том, чтобы проверить, произошел ли щелчок внутри выбранной ячейки:

- (void)viewDidLoad
{
    [super viewDidLoad];
    //gesture recognizer to close the keyboard when user taps away
    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard:)];
    tap.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tap];
}

-(void)dismissKeyboard:(UIGestureRecognizer*)tapGestureRecognizer
{
    if (!CGRectContainsPoint([self.tableView cellForRowAtIndexPath:[self.tableView indexPathForSelectedRow]].frame, [tapGestureRecognizer locationInView:self.tableView]))
    {
        [self.view endEditing:YES];
    }
}
2
Sam

Я нашел решение, которое прекрасно работает.

Необходимо использовать UIGestureRecognizerDelegate и метод - gestRecognizer: shouldReceiveTouch: .

Добавьте распознаватель жестов в TableView следующим образом: 

UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
tapGestureRecognizer.cancelsTouchesInView = NO;
tapGestureRecognizer.delegate = self;
[self.suggestedTableView addGestureRecognizer:tapGestureRecognizer];
[tapGestureRecognizer release];

Затем реализуйте метод shouldReceiveTouch Delegate для отклонения касаний, которые выполняются в классе UITableViewCell. Метод hideKeyboard будет вызываться только тогда, когда касание выполнено вне класса UITableViewCell.

- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer shouldReceiveTouch:(UITouch *)touch {
    if([touch.view isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCell
    if([touch.view.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    // UITableViewCellContentView => UITableViewCellScrollView => UITableViewCell
    if([touch.view.superview.superview isKindOfClass:[UITableViewCell class]]) {
        return NO;
    }
    return YES; // handle the touch
}

- (void) hideKeyboard{
    [textField resignFirstResponder];
}
2
mlabraca

Простое использование UITapGestureRecognizer и cancelsTouchesInView = NO означает, что нажатие на ячейки и UITextViews также вызывает скрытие. Это плохо, если у вас есть несколько UITextViews, и вы нажимаете на следующий. Клавиатура начнет скрываться, а затем следующий текстовый вид становится первым ответчиком, и клавиатура снова становится видимой. Чтобы избежать этого, проверьте местоположение касания и скрывайте клавиатуру, только если касание не находится в ячейке:

// init
UITapGestureRecognizer *tapRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(didTapTableView:)];
tapRecognizer.cancelsTouchesInView = NO;
[self.tableView addGestureRecognizer:tapRecognizer];


// Hide on tap
- (void)didTapTableView:(UITapGestureRecognizer *)tap
{
    CGPoint point = [tap locationInView:tap.view];
    [self.view endEditing:!CGRectContainsPoint([self.tableView rectForRowAtIndexPath:[self.tableView indexPathForRowAtPoint:point]], point)];
}

Для того, чтобы scrollViewWillBeginDragging: был запущен, свойство tableView scrollEnabled должно быть YES

// Hide on scroll
- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self.view endEditing:YES];
}
1
Shawn Throop

Я искал решение и не нашел ничего, что соответствовало бы моему коду, поэтому я сделал это так:

http://82517.tumblr.com/post/13189719252/dismiss-keyboard-on-uitableview-non-cell-tap

Это в основном комбинация вышеупомянутых подходов, но не требует создания подклассов или создания фоновых кнопок.

1
Miro Hudak

Много интересных ответов. Я хотел бы скомпилировать различные подходы в решение, которое, по моему мнению, лучше всего подходит для сценария UITableView (это тот, который я обычно использую): Как правило, мы хотим в основном скрыть клавиатуру в двух сценариях: при нажатии вне текста Элементы пользовательского интерфейса или прокрутка вниз/вверх UITableView. Первый сценарий мы можем легко добавить с помощью TapGestureRecognizer, а второй - с помощью UIScrollViewDelegate scrollViewWillBeginDragging: method . Первый порядок бизнеса, метод скрытия клавиатуры:

   /**
     *  Shortcut for resigning all responders and pull-back the keyboard
     */
    -(void)hideKeyboard
    {
        //this convenience method on UITableView sends a nested message to all subviews, and they resign responders if they have hold of the keyboard
        [self.tableView endEditing:YES];

    }

Этот метод подает в отставку любой пользовательский интерфейс textField подпредставлений в иерархии представлений UITableView, поэтому он более практичен, чем самостоятельная отмена каждого отдельного элемента.

Затем мы позаботимся об увольнении с помощью внешнего касания с помощью:

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.
    [self setupKeyboardDismissGestures];

}

- (void)setupKeyboardDismissGestures
{

//    Example for a swipe gesture recognizer. it was not set-up since we use scrollViewDelegate for dissmin-on-swiping, but it could be useful to keep in mind for views that do not inherit from UIScrollView
//    UISwipeGestureRecognizer *swipeUpGestureRecognizer = [[UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
//    swipeUpGestureRecognizer.cancelsTouchesInView = NO;
//    swipeUpGestureRecognizer.direction = UISwipeGestureRecognizerDirectionUp;
//    [self.tableView addGestureRecognizer:swipeUpGestureRecognizer];

    UITapGestureRecognizer *tapGestureRecognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(hideKeyboard)];
    //this prevents the gestureRecognizer to override other Taps, such as Cell Selection
    tapGestureRecognizer.cancelsTouchesInView = NO;
    [self.tableView addGestureRecognizer:tapGestureRecognizer];

}

Если для tapGestureRecognizer.cancelsTouchesInView задано значение NO, это не позволит gestRecognizer переопределить обычные внутренние операции UITableView (например, чтобы не мешать выбору ячейки).

Наконец, чтобы справиться с сокрытием клавиатуры при прокрутке вверх/вниз UITableView, мы должны реализовать протокол scrollViewWillBeginDragging: метод UIScrollViewDelegate, как:

.h файл

@interface MyViewController : UIViewController <UIScrollViewDelegate>

.m файл

#pragma mark - UIScrollViewDelegate

-(void)scrollViewWillBeginDragging:(UIScrollView *)scrollView
{
    [self hideKeyboard];
}

Я надеюсь, что это помогает! знак равно

0
Robertibiris

Попробуй это:

viewDidLoad(){

    let tap: UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(dismissKeyboard))

    tableView.addGestureRecognizer(tap)

}
//Calls this function when the tap is recognized.
@objc func dismissKeyboard() {

    //Causes the view (or one of its embedded text fields) to resign the first responder status.
    view.endEditing(true)

}
0
Michael Colonna

UITableView имеет удобное свойство backgroundView, с помощью которого я добился такого поведения, не вмешиваясь в выборку ячеек, как показано ниже в Swift:

let tableBackTapRecognizer = UITapGestureRecognizer(target: self, action: #selector(hideKeyboard))
tableView.backgroundView = UIView()
tableView.backgroundView?.addGestureRecognizer(tableBackTapRecognizer)
0
Şafak Gezer

Если вы хотите закрыть клавиатуру при нажатой клавише возврата, вы можете просто добавить следующий код в textField, который должен возвращать метод, т.е. 

- (BOOL)textFieldShouldReturn:(UITextField *)atextField
{
   [textField resignFirstresponder];
}

Некоторые текстовые поля могут иметь представление выбора или другое в качестве подпредставления, поэтому в этом случае вышеописанный метод не работает, поэтому в этом случае нам нужно использовать класс UITapGestureRecognizer, т.е. добавить следующий фрагмент кода в метод viewDidLoad, т.е.

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self
                                                                          action:@selector(dismissKeyboard)];

    [self.view addGestureRecognizer:tap];

Теперь просто добавьте респондента в отставку к методу выбора, т.е.

-(void)dismissKeyboard 
{
    [textField resignFirstResponder];
}

Надеюсь, это поможет, спасибо :)

0
Eshwar Chaitanya

Почему вы хотите создать таблицу, полную текстовых полей? Вы должны использовать подробное представление для каждой строки, которая содержит текстовые поля Когда вы нажимаете подробное представление, убедитесь, что вы вызываете «[myTextField intoFirstResponder]», чтобы пользователь мог начать редактирование одним щелчком мыши от таблицы список.

0
Mugunth

Ответ @ mixca очень полезен, но что, если у меня есть что-то отличное от UITextField. Я думаю, что лучший способ справиться с этим путем поиска всех подпредставлений основного вида с помощью рекурсивной функции, посмотрите пример ниже

- (BOOL)findAndResignFirstResponder {
if (self.isFirstResponder) {
    [self resignFirstResponder];
    return YES;
}

    for (UIView *subView in self.subviews) {
        if ([subView findAndResignFirstResponder]) {
            return YES;
        }
    }
    return NO;
}

а также вы можете поместить этот метод в свой служебный класс и использовать жест от нажатия, как ответ @ mixca.

0
mert

Если вы хотите создать подкласс (тьфу!) Представления таблицы, что-то вроде этого может сработать:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

   BOOL backgroundTouched = YES;

   for (UITouch *touch in touches) {
      CGPoint location = [touch locationInView:self];
      for (UITableViewCell *cell in self.visibleCells) {
         if (CGRectContainsPoint(cell.frame, location)) {
            backgroundTouched = NO;
            break;
         }
      }
   }

   if (backgroundTouched) {
      for (UITableViewCell *cell in self.visibleCells) {
         // This presumes the first subview is the text field you want to resign.
         [[cell.contentView.subviews objectAtIndex:0] resignFirstResponder];
      }
   }

   [super touchesBegan:touches withEvent:event];
}
0
Joe D'Andrea

Вот как я наконец сделал работы. Я объединил предложения и коды из разных ответов. Особенности. Отмена клавиатуры, перемещение текстовых полей над клавиатурой при редактировании и установка «Далее» и «Готово».

static const CGFloat ANIMATION_DURATION = 0.4;
static const CGFloat LITTLE_SPACE = 5;
CGFloat animatedDistance;
CGSize keyboardSize;

@interface ViewController () <UITextFieldDelegate>
 @property (weak, nonatomic) IBOutlet UITextField *firstNameTXT;
  .....// some other text fields
 @property (weak, nonatomic) IBOutlet UITextField *emailTXT;
@end

@implementation ViewController
- (void)viewDidLoad{
.....
// add tap gesture to help in dismissing keyboard
UITapGestureRecognizer * tapGesture = [[UITapGestureRecognizer alloc]
                                       initWithTarget:self
                                       action:@selector(tapScreen:)];// outside textfields

[self.view addGestureRecognizer:tapGesture];

// set text fields return key type to Next, last text field to Done
[self.firstNameTXT setReturnKeyType:UIReturnKeyNext];
.....
[self.emailTXT setReturnKeyType:UIReturnKeyDone];

// set text fields tags
[self.firstNameTXT setTag:0];
....// more text fields
[self.emailTXT setTag:5];

// add keyboard notification
[[NSNotificationCenter defaultCenter] addObserver:self     selector:@selector(keyboardDidShow:) name:UIKeyboardDidShowNotification object:nil];
}
[[NSNotificationCenter defaultCenter] addObserver:self      selector:@selector(keyboardDidHide:) name:UIKeyboardDidHideNotification object:nil];
}

// dismiss keyboard when tap outside text fields
- (IBAction)tapScreen:(UITapGestureRecognizer *)sender {
  if([self.firstNameTXT isFirstResponder])[self.firstNameTXT resignFirstResponder];
  ...
  if([self.emailTXT isFirstResponder])[self.emailTXT  resignFirstResponder];

  }
- (BOOL)textFieldShouldReturn:(UITextField *)textField{
   if(textField.returnKeyType==UIReturnKeyNext) {
     // find the text field with next tag
     UIView *next = [[textField superview] viewWithTag:textField.tag+1];
     [next becomeFirstResponder];
   } else if (textField.returnKeyType==UIReturnKeyDone || textField.returnKeyType==UIReturnKeyDefault) {
    [textField resignFirstResponder];
 }
return YES;
}

// Moving current text field above keyboard
-(BOOL) textFieldShouldBeginEditing:(UITextField*)textField{
   CGRect viewFrame = self.view.frame;
   CGRect textFieldRect = [self.view.window convertRect:textField.bounds fromView:textField];
   CGRect viewRect = [self.view.window convertRect:self.view.bounds fromView:self.view];
   CGFloat textFieldBottomLine = textFieldRect.Origin.y + textFieldRect.size.height + LITTLE_SPACE;//

   CGFloat keyboardHeight = keyboardSize.height;

   BOOL isTextFieldHidden = textFieldBottomLine > (viewRect.size.height - keyboardHeight)? TRUE :FALSE;
  if (isTextFieldHidden) {
    animatedDistance = textFieldBottomLine - (viewRect.size.height - keyboardHeight) ;
    viewFrame.Origin.y -= animatedDistance;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
  return YES;
}

-(void) restoreViewFrameOrigionYToZero{
  CGRect viewFrame = self.view.frame;
  if (viewFrame.Origin.y != 0) {
    viewFrame.Origin.y = 0;
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:ANIMATION_DURATION];
    [self.view setFrame:viewFrame];
    [UIView commitAnimations];
  }
}

-(void)keyboardDidShow:(NSNotification*)aNotification{
   NSDictionary* info = [aNotification userInfo];
   keyboardSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
 }

-(void)keyboardDidHide:(NSNotification*)aNotification{
   [self restoreViewFrameOrigionYToZero];// keyboard is dismissed, restore frame view to its  zero Origin
}
@end
0
Kamel