webentwicklung-frage-antwort-db.com.de

Schließen Sie die Tastatur ab, indem Sie den Hintergrund von UITableView berühren

Ich habe eine UITableView mit UITextFields als Zellen. Ich möchte die Tastatur verwerfen, wenn der Hintergrund der UITableView berührt wird. Ich versuche dies, indem ich eine UIButton der Größe der UITableView erstellt und sie hinter die UITableView setze. Das einzige Problem ist, dass UIButton alle Berührungen einfängt, selbst wenn sich die Berührung in der UITableView befindet. Was mache ich falsch?

Vielen Dank!

97
Hua-Ying

Dies lässt sich leicht durch Erstellen eines UITapGestureRecognizer - Objekts (standardmäßig wird eine "Geste" mit einem einzigen Tastendruck erkannt, sodass keine weiteren Anpassungen erforderlich sind), ein Ziel/eine Aktion für das Auslösen der Geste und das anschließende Anhängen festgelegt das Gestenerkennungsobjekt in Ihre Tabellenansicht.

Z.B. Vielleicht in Ihrer viewDidLoad-Methode:

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

Die hideKeyboard-Methode könnte folgendermaßen aussehen:

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

Beachten Sie, dass die Geste nicht ausgelöst wird, wenn Sie ein UITextField-Objekt berühren. Es wird zwar im UITableView-Hintergrund, in der Fußzeilenansicht, in der Kopfansicht und in UILabels in Zellen usw. ausgelöst.

197
mixja

Die UITapGestureRecognizer-Lösung funktioniert mit der Auswahl von Tabellenzellen, wenn Sie Folgendes festlegen:

gestureRecognizer.cancelsTouchesInView = NO;
123
Azbuky

Hier ist der beste Weg, dies zu tun

[self.view endEditing:YES];

oder 

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

Sie können es auch vom Storyboard aus tun: enter image description here

50
Ben

Da UITableView eine Unterklasse von UIScrollView ist, ist die Implementierung einer Delegatmethode unten eine äußerst einfache und schnelle Lösung. Es ist nicht einmal erforderlich, resignFirstResponder zu involvieren, da die Ansichtshierarchie den aktuellen Responder nach innen sucht und ihn auffordert, den Responder-Status aufzugeben. 

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

Denken Sie daran, UIScrollViewDelegate zur Header-Datei hinzuzufügen. 

22
Rajive Jain

Hören Sie zunächst nach scrollViewWillBeginDragging in Ihrer UIViewController, indem Sie die UIScrollViewDelegate hinzufügen:

In .h-Datei:

@interface MyViewController : UIViewController <UIScrollViewDelegate> 

In .m Datei:

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

    [self dismissKeyboard];

}

Dann hören Sie auf andere Interaktionen:

- (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];

}

Dann implementiere dismissKeyboard:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

    [yourTextFieldPointer resignFirstResponder];

}

Und wenn Sie wie ich die Tastatur für ein UITextField in einer benutzerdefinierten Tabellenzelle entfernen möchten:

- (void)dismissKeyboard {

    NSLog(@"dismissKeyboard");

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

}

Hoffe das hilft jedem beim Suchen !!

12
bbeckford
tableView.keyboardDismissMode = .onDrag
9
Dom Bryan

Hier ist die Swift-Version für Ihr Codiervergnügen:

Er fügt eine Tipp-Gestenerkennung hinzu und schließt die Tastatur. Es ist kein Ausgang für das TextField erforderlich!

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

Ich habe es so gemacht:

Erstellen Sie eine Methode in Ihrem TableViewController, um den ersten Responder zu deaktivieren (dies wäre Ihre TextBox zu diesem Zeitpunkt).

- (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;
}

Rufen Sie in tableView:didSelectRowAtIndexPath: die vorherige Methode auf:

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

Ich hatte eine UITableViewController und die Implementierung von touchesBegan:withEvent: hat für mich nicht funktioniert. 

Folgendes hat funktioniert:

Schnell: 

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

Ziel c:

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

Es gibt die Swift-3-Version, ohne die Zellen zu blockieren.

In viewDidLoad()-Methode:

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

Und hideKeyboard sieht so aus:

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

Wenn Sie auf iOS7 abzielen, können Sie eine der folgenden Möglichkeiten verwenden:

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeOnDrag;

tableView.keyboardDismissMode = UIScrollViewKeyboardDismissModeInteractive;

Ersteres animiert die Tastatur außerhalb des Bildschirms, wenn die Tabellenansicht gescrollt wird, und später wird die Tastatur wie die Standard-Nachrichten-App ausgeblendet.

Beachten Sie, dass diese von UIScrollView stammen, von der UITableView erbt.

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

Stellen Sie dann sicher, dass Sie in Ihrer Nib-Datei den Typ Ihrer UITableView auf DismissableUITableView setzen. Möglicherweise hätte ich mir einen besseren Namen für diese Klasse vorstellen können.

4
bandejapaisa

UITableView ist eine Unterklasse von UIScrollView. 

Ich habe auf ein Scroll-Ereignis durch den Benutzer gewartet und dann resignFirstResponder. Hier ist die UIScrollViewDelegate-Methode, die in Ihrem Code implementiert werden soll.

- (void)scrollViewWillBeginDragging:(UIScrollView *)scrollView

Bei dieser Art von Problemen habe ich festgestellt, dass der beste Weg darin besteht, die Delegatenprotokolle für jedes Objekt und die der übergeordneten Klassen zu untersuchen (in diesem Fall UITableViewDelegate, UIScrollViewDelegate. Die Anzahl der Ereignis NS - Objekte ist ziemlich groß Es ist auch einfacher, ein Protokoll zu implementieren, als alles andere zu klassifizieren.

2
pschang

Ich hatte das gleiche Problem und hier ist meine Lösung, es funktioniert perfekt für mich:

In der Ansicht oder dem View-Controller, den Sie implementiert haben, <UITextFieldDelegate>

(In meinem Fall habe ich ein benutzerdefiniertes UITableViewCell namens TextFieldCell), 

Deklarieren Sie UITapGestureRecognizer als Eigenschaft:

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

Und initialisieren Sie es in Ihrer Ansicht/Ihrem Controller:

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

Verwenden Sie in der - (void)textFieldDidBeginEditing:(UITextField *)textField-Methode superView, um zu Ihrer tableView zu gelangen und addGestureRecognizer aufzurufen:

[self.superview.superview addGestureRecognizer:gestureRecognizer];

Und in der - (void)textFieldDidEndEditing:(UITextField *)textField entfernen Sie einfach die Gestenerkennung:

[self.superview.superview removeGestureRecognizer:gestureRecognizer];

Ich hoffe es hilft.

2
hac.jack

Ich wollte, dass meine Zelle die Tastatur öffnet, wenn ein Teil der Zelle ausgewählt wurde, und schließt sie, wenn Sie auf eine beliebige Stelle in der Zelle geklickt haben. So öffnen Sie die Tastatur:

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

(HINWEIS: Ich habe die Zelle in eine Unterklasse aufgenommen, aber Sie können dies leicht mit der tableView:didSelectRowAtIndexPath:-Delegat-Methode von UITableView erreichen.)

Dies bedeutete, dass bei den Top-Lösungen beim zweimaligen Klicken auf die Zelle die Tastatur wackelte, da der Gestenerkenner zuerst versuchte, die Tastatur zu schließen, und zweitens wurde die Zelle erneut ausgewählt und die Tastatur geöffnet.

Lösung ist zu prüfen, ob der Klick in der aktuell ausgewählten Zelle aufgetreten ist:

- (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

Ich habe eine Lösung gefunden, die großartig funktioniert.

Wird benötigt, um die UIGestureRecognizerDelegate und die Methode - gestureRecognizer: shouldReceiveTouch: zu verwenden.

Fügen Sie die Gestenerkennung wie folgt zur TableView hinzu: 

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

Implementieren Sie anschließend die Delegate-Methode shouldReceiveTouch , um Berührungen abzulehnen, die in der UITableViewCell-Klasse ausgeführt werden. Die hideKeyboard -Methode wird nur aufgerufen, wenn die Berührung außerhalb der UITableViewCell-Klasse durchgeführt wurde.

- (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

Die einfache Verwendung von UITapGestureRecognizer und cancelsTouchesInView = NO bedeutet, dass Taps auf Zellen und UITextViews auch das Hide auslösen. Dies ist schlecht, wenn Sie mehrere UITextViews haben und auf die nächste tippen. Die Tastatur wird ausgeblendet und die nächste Textansicht wird zum ersten Antworter, und die Tastatur wird wieder sichtbar. Um dies zu vermeiden, überprüfen Sie die Position des Klicks und blenden Sie die Tastatur nur aus, wenn der Klopfen nicht in einer Zelle ist:

// 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)];
}

Damit scrollViewWillBeginDragging: ausgelöst werden kann, muss die scrollEnabled-Eigenschaft von tableView YES sein.

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

Ich habe nach der Lösung gesucht und nichts gefunden, das zu meinem Code passt, also habe ich es so gemacht:

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

Es ist im Grunde eine Kombination der oben genannten Ansätze, erfordert jedoch keine Unterklassen oder das Erstellen von Hintergrundschaltflächen.

1
Miro Hudak

Viele interessante Antworten. Ich möchte verschiedene Ansätze in die Lösung integrieren, von der ich dachte, dass sie am besten in ein UITableView-Szenario passt (das ist das, das ich normalerweise verwende): Was wir normalerweise wollen, ist, die Tastatur in zwei Szenarien zu verbergen: beim Tippen außerhalb des Texts UI-Elemente oder beim Scrollen nach oben/unten in der UITableView. Das erste Szenario kann leicht über einen TapGestureRecognizer hinzugefügt werden, das zweite über die UIScrollViewDelegate-Methode scrollViewWillBeginDragging: .. .. Die erste Methode, um die Tastatur auszublenden:

   /**
     *  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];

    }

Mit dieser Methode wird eine beliebige textField-Benutzeroberfläche der Unteransichten innerhalb der UITableView-Ansichtshierarchie neu festgelegt, sodass sie praktischer ist als jedes einzelne Element unabhängig zu resignieren.

Als nächstes kümmern wir uns um das Abweisen über eine externe Tap-Geste mit:

- (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];

}

Wenn Sie tapGestureRecognizer.cancelsTouchesInView auf NO setzen, wird verhindert, dass der gestureRecognizer die normalen inneren Funktionen der UITableView überschreibt (z. B. um die Zellauswahl nicht zu beeinträchtigen).

Um die Tastatur beim Scrollen nach oben/unten durch UITableView verbergen zu können, müssen Sie die scrollViewWillBeginDragging: -Methode des UIScrollViewDelegate-Protokolls implementieren:

.h Datei

@interface MyViewController : UIViewController <UIScrollViewDelegate>

.m Datei

#pragma mark - UIScrollViewDelegate

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

Ich hoffe, es hilft! =)

0
Robertibiris

Versuche dies:

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 hat eine praktische backgroundView-Eigenschaft, mit der ich dieses Verhalten erreicht habe, ohne die Zellauswahl zu beeinträchtigen, wie in Swift gezeigt:

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

Wenn Sie die Tastatur bei gedrückter Return-Taste schließen möchten, können Sie einfach den folgenden Code in die textField-Methode einfügen, die die Methode zurückgeben soll, d. H .: 

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

Einige Textfelder verfügen möglicherweise über eine Auswahlansicht oder eine andere als Unteransicht. In diesem Fall funktioniert die obige Methode nicht. In diesem Fall müssen Sie die UITapGestureRecognizer-Klasse verwenden, d.

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

    [self.view addGestureRecognizer:tap];

Fügen Sie nun einfach den Rückantwort-Responder zur Auswahlmethode hinzu, d. H .:

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

Hoffe es hilft, danke :)

0

Warum möchten Sie eine Tabelle mit Textfeldern erstellen? Sie sollten für jede Zeile, die die Textfelder enthält, eine Detailansicht verwenden. Wenn Sie Ihre Detailansicht drücken, stellen Sie sicher, dass Sie "[myTextField becomeFirstResponder]" aufrufen, damit der Benutzer die Bearbeitung mit nur einem Klick außerhalb der Tabelle beginnen kann Liste.

0
Mugunth

@ mixcas Antwort ist sehr nützlich, aber was ist, wenn ich etwas anderes als UITextField habe? Ich denke, der beste Weg, um damit umzugehen, indem ich alle Unteransichten der Hauptansicht mit rekursiver Funktion durchsucht, siehe Beispiel unten

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

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

sie können diese Methode auch in Ihre Utility-Klasse aufnehmen und von der Geste wie @ mixcas Antwort verwenden.

0
mert

Wenn Sie bereit sind, Ihre Tabellenansicht zu subclassieren (ugh!), so ähnlich könnte funktionieren:

- (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

So habe ich endlich Werke gemacht. Ich kombinierte Vorschläge und Codes aus verschiedenen Antworten. Funktionen: Tastatur schließen, Textfelder während der Bearbeitung über der Tastatur verschieben und "Weiter" und "Fertig" festlegen

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