Einen UITableView blättern, wenn Textfeld ausgewählt ist,

stimmen
228

Nach einer Menge von Versuch und Irrtum, gebe ich auf und die Frage zu stellen. Ich habe eine Menge von Menschen mit ähnlichen Problemen gesehen, aber nicht alle Antworten richtig zu arbeiten.

Ich habe eine , UITableViewdie von benutzerdefinierten Zellen zusammengesetzt ist. Die Zellen werden aus 5 Textfelder nebeneinander (wie eine Art Gitter).

Wenn ich versuche , die Zellen am Boden des blättern und zu bearbeiten UITableView, kann ich nicht verwalten meine Zellen über der Tastatur richtig positioniert zu bekommen.

Ich habe viele Antworten über das Ändern von Ansichtsgrößen sprechen gesehen, etc ... aber keiner von ihnen hat gut bisher funktioniert.

Könnte jemand die „richtige“ Art und Weise verdeutlichen dies mit einem konkreten Codebeispiel zu tun?

Veröffentlicht am 27/02/2009 um 11:05
quelle vom benutzer
In anderen Sprachen...                            


48 antworten

stimmen
110

Wenn Sie UITableViewController statt UIViewController verwenden, wird es automatisch so tun.

Beantwortet am 21/09/2010 um 04:42
quelle vom benutzer

stimmen
89

Die Funktion, die das Scrollen funktioniert könnte viel einfacher:

- (void) textFieldDidBeginEditing:(UITextField *)textField {
    UITableViewCell *cell;

    if (floor(NSFoundationVersionNumber) <= NSFoundationVersionNumber_iOS_6_1) {
    // Load resources for iOS 6.1 or earlier
        cell = (UITableViewCell *) textField.superview.superview;

    } else {
        // Load resources for iOS 7 or later
        cell = (UITableViewCell *) textField.superview.superview.superview; 
       // TextField -> UITableVieCellContentView -> (in iOS 7!)ScrollView -> Cell!
    }
    [tView scrollToRowAtIndexPath:[tView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

Das ist es. Keine Berechnungen überhaupt.

Beantwortet am 15/04/2009 um 13:21
quelle vom benutzer

stimmen
65

Ich mache etwas sehr ähnlich es generic ist, keine Notwendigkeit, etwas Bestimmtes für Ihren Code zu berechnen. Überprüfen Sie die Bemerkungen über den Code:

in MyUIViewController.h

@interface MyUIViewController: UIViewController <UITableViewDelegate, UITableViewDataSource>
{
     UITableView *myTableView;
     UITextField *actifText;
}

@property (nonatomic, retain) IBOutlet UITableView *myTableView;
@property (nonatomic, retain) IBOutlet UITextField *actifText;

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField;
- (IBAction)textFieldDidEndEditing:(UITextField *)textField;

-(void) keyboardWillHide:(NSNotification *)note;
-(void) keyboardWillShow:(NSNotification *)note;

@end

in MyUIViewController.m

@implementation MyUIViewController

@synthesize myTableView;
@synthesize actifText;

- (void)viewDidLoad 
{
    // Register notification when the keyboard will be show
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(keyboardWillShow:)
                                          name:UIKeyboardWillShowNotification
                                          object:nil];

    // Register notification when the keyboard will be hide
    [[NSNotificationCenter defaultCenter] addObserver:self
                                          selector:@selector(keyboardWillHide:)
                                          name:UIKeyboardWillHideNotification
                                          object:nil];
}

// To be link with your TextField event "Editing Did Begin"
//  memoryze the current TextField
- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    self.actifText = textField;
}

// To be link with your TextField event "Editing Did End"
//  release current TextField
- (IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    self.actifText = nil;
}

-(void) keyboardWillShow:(NSNotification *)note
{
    // Get the keyboard size
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

    // Detect orientation
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect frame = self.myTableView.frame;

    // Start animation
    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // Reduce size of the Table view 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
        frame.size.height -= keyboardBounds.size.height;
    else 
        frame.size.height -= keyboardBounds.size.width;

    // Apply new size of table view
    self.myTableView.frame = frame;

    // Scroll the table view to see the TextField just above the keyboard
    if (self.actifText)
      {
        CGRect textFieldRect = [self.myTableView convertRect:self.actifText.bounds fromView:self.actifText];
        [self.myTableView scrollRectToVisible:textFieldRect animated:NO];
      }

    [UIView commitAnimations];
}

-(void) keyboardWillHide:(NSNotification *)note
{
    // Get the keyboard size
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardFrameBeginUserInfoKey] getValue: &keyboardBounds];

    // Detect orientation
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect frame = self.myTableView.frame;

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationBeginsFromCurrentState:YES];
    [UIView setAnimationDuration:0.3f];

    // Increase size of the Table view 
    if (orientation == UIInterfaceOrientationPortrait || orientation == UIInterfaceOrientationPortraitUpsideDown)
        frame.size.height += keyboardBounds.size.height;
    else 
        frame.size.height += keyboardBounds.size.width;

    // Apply new size of table view
    self.myTableView.frame = frame;

    [UIView commitAnimations];
}

@end

Swift 1.2+ Version:

class ViewController: UIViewController, UITextFieldDelegate {
    @IBOutlet weak var activeText: UITextField!
    @IBOutlet weak var tableView: UITableView!

    override func viewDidLoad() {
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillShow:"),
            name: UIKeyboardWillShowNotification,
            object: nil)
        NSNotificationCenter.defaultCenter().addObserver(self,
            selector: Selector("keyboardWillHide:"),
            name: UIKeyboardWillHideNotification,
            object: nil)
    }

    func textFieldDidBeginEditing(textField: UITextField) {
        activeText = textField
    }

    func textFieldDidEndEditing(textField: UITextField) {
        activeText = nil
    }

    func keyboardWillShow(note: NSNotification) {
        if let keyboardSize = (note.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            var frame = tableView.frame
            UIView.beginAnimations(nil, context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(0.3)
            frame.size.height -= keyboardSize.height
            tableView.frame = frame
            if activeText != nil {
                let rect = tableView.convertRect(activeText.bounds, fromView: activeText)
                tableView.scrollRectToVisible(rect, animated: false)
            }
            UIView.commitAnimations()
        }
    }

    func keyboardWillHide(note: NSNotification) {
        if let keyboardSize = (note.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.CGRectValue() {
            var frame = tableView.frame
            UIView.beginAnimations(nil, context: nil)
            UIView.setAnimationBeginsFromCurrentState(true)
            UIView.setAnimationDuration(0.3)
            frame.size.height += keyboardSize.height
            tableView.frame = frame
            UIView.commitAnimations()
        }
    }
}
Beantwortet am 13/04/2010 um 15:46
quelle vom benutzer

stimmen
41

Ich hatte das gleiche Problem, aber bemerkt, dass es nur in einer Ansicht angezeigt wird. So begann ich für die Unterschiede in den Controllern zu suchen.

Ich fand heraus , dass das Bildlaufverhalten in gesetzt ist - (void)viewWillAppear:(BOOL)animatedder Super - Instanz.

So sicher sein, wie dies zu realisieren:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];
    // your code
}

Und es spielt keine Rolle , ob Sie verwenden UIViewControlleroder UITableViewController; überprüft es durch ein Putting UITableViewals Subview self.view in der UIViewController. Es war das gleiche Verhalten. Die Aussicht war es nicht möglich, wenn der Anruf blättern [super viewWillAppear:animated];fehlt.

Beantwortet am 29/05/2011 um 01:42
quelle vom benutzer

stimmen
37

Vielleicht habe ich diese verpasst, da ich nicht den ganzen Beitrag hier gelesen haben, aber was kam ich mit scheint trügerisch einfach. Ich habe dies nicht durch den Mangel gedreht setzen, in allen Situationen zu testen, aber es scheint, wie es gut funktionieren soll.

justieren einfach die contentInset des Tableview durch die Höhe der Tastatur, und dann bewegen Sie die Zelle auf den Grund:

- (void)keyboardWasShown:(NSNotification *)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);
    self.myTableView.contentInset = contentInsets;
    self.myTableView.scrollIndicatorInsets = contentInsets;

    [self.myTableView scrollToRowAtIndexPath:self.currentField.indexPath atScrollPosition:UITableViewScrollPositionBottom animated:YES];
}

und natürlich

- (void)keyboardWasHidden:(NSNotification *)aNotification
{
    [UIView animateWithDuration:.3 animations:^(void) 
    {
        self.myTableView.contentInset = UIEdgeInsetsZero;
        self.myTableView.scrollIndicatorInsets = UIEdgeInsetsZero;
    }];
}

ist das zu einfach? Ich bin etwas fehlt? so weit ist es gut für mich arbeiten, aber wie ich schon sagte, habe ich es nicht in dem Mangel setzen ...

Beantwortet am 18/08/2012 um 01:12
quelle vom benutzer

stimmen
35

Die einfachste Lösung für Swift 3 , basierend auf Bartłomiej Semańczyk Lösung :

override func viewDidLoad() {
    super.viewDidLoad()

    NotificationCenter.default.addObserver(self, selector: #selector(CreateEditRitualViewController.keyboardWillShow(notification:)), name: NSNotification.Name.UIKeyboardDidShow, object: nil)
    NotificationCenter.default.addObserver(self, selector: #selector(CreateEditRitualViewController.keyboardWillHide(notification:)), name: NSNotification.Name.UIKeyboardDidHide, object: nil)
}

deinit {
    NotificationCenter.default.removeObserver(self)
}

// MARK: Keyboard Notifications

@objc func keyboardWillShow(notification: NSNotification) {
    if let keyboardHeight = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue.height {
        tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.2, animations: {
        // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
        self.tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
    })
}
Beantwortet am 08/12/2016 um 13:26
quelle vom benutzer

stimmen
34

Wenn Sie verwenden können UITableViewController, erhalten Sie die Funktionalität kostenlos. Manchmal jedoch ist dies nicht eine Option, speziell wenn Sie mehrere Ansichten müssen nicht nur die UITableView.

Einige der Lösungen , die hier vorgestellt funktionieren nicht auf iOS ≥4, einige funktionieren nicht auf dem iPad oder im Querformat, einige arbeiten nicht für Bluetooth - Tastaturen (wo wir jede Scrollen nicht wollen), manche nicht arbeiten , wenn zwischen mehreren Textfeldern umgeschaltet wird . Also , wenn Sie eine Lösung wählen, stellen Sie sicher , dass diese Fälle zu testen. Dies ist die Lösung , die wir verwenden verwenden in InAppSettingsKit :

- (void)_keyboardWillShow:(NSNotification*)notification {
    if (self.navigationController.topViewController == self) {
        NSDictionary* userInfo = [notification userInfo];

        // we don't use SDK constants here to be universally compatible with all SDKs ≥ 3.0
        NSValue* keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardBoundsUserInfoKey"];
        if (!keyboardFrameValue) {
            keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
        }

        // Reduce the tableView height by the part of the keyboard that actually covers the tableView
        CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
        if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
            windowRect = IASKCGRectSwap(windowRect);
        }
        CGRect viewRectAbsolute = [_tableView convertRect:_tableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
        if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
            viewRectAbsolute = IASKCGRectSwap(viewRectAbsolute);
        }
        CGRect frame = _tableView.frame;
        frame.size.height -= [keyboardFrameValue CGRectValue].size.height - CGRectGetMaxY(windowRect) + CGRectGetMaxY(viewRectAbsolute);

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
        _tableView.frame = frame;
        [UIView commitAnimations];

        UITableViewCell *textFieldCell = (id)((UITextField *)self.currentFirstResponder).superview.superview;
        NSIndexPath *textFieldIndexPath = [_tableView indexPathForCell:textFieldCell];

        // iOS 3 sends hide and show notifications right after each other
        // when switching between textFields, so cancel -scrollToOldPosition requests
        [NSObject cancelPreviousPerformRequestsWithTarget:self];

        [_tableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
    }
}

- (void) scrollToOldPosition {
  [_tableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)_keyboardWillHide:(NSNotification*)notification {
    if (self.navigationController.topViewController == self) {
        NSDictionary* userInfo = [notification userInfo];

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
        [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
        _tableView.frame = self.view.bounds;
        [UIView commitAnimations];

        [self performSelector:@selector(scrollToOldPosition) withObject:nil afterDelay:0.1];
    }
}   

Hier ist der vollständige Code der Klasse in InAppSettingsKit. Um es zu testen, verwenden Sie den „Vollständige Liste“ Kinderbereich , wo Sie die Szenarien oben genannten testen können.

Beantwortet am 13/12/2010 um 17:01
quelle vom benutzer

stimmen
34

Ich glaube, ich habe mit der Lösung kommen, das Verhalten von Apples Anwendungen anzupassen.

Zuerst in Ihrem viewWillAppear: Abonnieren Sie den Tastatur-Benachrichtigungen, so dass Sie wissen, wenn die Tastatur zeigen und verstecken, und das System wird die Größe der Tastatur sagen, aber nicht‘vergessen in Ihrem viewWillDisappear abzumelden :.

[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(keyboardWillShow:)
           name:UIKeyboardWillShowNotification
         object:nil];
[[NSNotificationCenter defaultCenter]
    addObserver:self
       selector:@selector(keyboardWillHide:)
           name:UIKeyboardWillHideNotification
         object:nil];

Implementieren Sie die Methoden ähnlich dem unten, so dass Sie die Größe Ihrer Tableview einstellen, sobald die Tastatur zeigt den sichtbaren Bereich entsprechen. Hier bin ich Tracking den Zustand der Tastatur getrennt, damit ich wählen kann, wenn die Tableview zurück in voller Höhe setzen ich, da Sie diese Benachrichtigungen auf jeder Feldänderung erhalten. Vergessen Sie nicht, keyboardWillHide zu implementieren: und wählen Sie irgendwo angemessen Ihre Größe Tableview zu beheben.

-(void) keyboardWillShow:(NSNotification *)note
{
    CGRect keyboardBounds;
    [[note.userInfo valueForKey:UIKeyboardBoundsUserInfoKey] getValue: &keyboardBounds];
    keyboardHeight = keyboardBounds.size.height;
    if (keyboardIsShowing == NO)
    {
        keyboardIsShowing = YES;
        CGRect frame = self.view.frame;
        frame.size.height -= keyboardHeight;

        [UIView beginAnimations:nil context:NULL];
        [UIView setAnimationBeginsFromCurrentState:YES];
        [UIView setAnimationDuration:0.3f];
        self.view.frame = frame;
        [UIView commitAnimations];
    }
}

Jetzt ist hier das Scrollen Bit arbeiten wir zuerst ein paar Größen, dann sehen wir, wo wir im sichtbaren Bereich sind, und stellen Sie die rect wir blättern wollen entweder die Hälfte Ansicht oberhalb oder unterhalb der Mitte des Textfeldes zu sein, basierend auf, wo sie in der Ansicht ist. In diesem Fall haben wir eine Reihe von UITextFields und eine ENUM, die Spur von ihnen hält, so durch die Zeilennummer rowHeight Multiplikation gibt uns die tatsächlichen innerhalb des Rahmens dieser Außenansicht versetzt.

- (void) textFieldDidBeginEditing:(UITextField *)textField
{
    CGRect frame = textField.frame;
    CGFloat rowHeight = self.tableView.rowHeight;
    if (textField == textFields[CELL_FIELD_ONE])
    {
        frame.origin.y += rowHeight * CELL_FIELD_ONE;
    }
    else if (textField == textFields[CELL_FIELD_TWO])
    {
        frame.origin.y += rowHeight * CELL_FIELD_TWO;
    }
    else if (textField == textFields[CELL_FIELD_THREE])
    {
        frame.origin.y += rowHeight * CELL_FIELD_THREE;
    }
    else if (textField == textFields[CELL_FIELD_FOUR])
    {
        frame.origin.y += rowHeight * CELL_FIELD_FOUR;
    }
    CGFloat viewHeight = self.tableView.frame.size.height;
    CGFloat halfHeight = viewHeight / 2;
    CGFloat midpoint = frame.origin.y + (textField.frame.size.height / 2);
    if (midpoint < halfHeight)
    {
        frame.origin.y = 0;
        frame.size.height = midpoint;
    }
    else
    {
        frame.origin.y = midpoint;
        frame.size.height = midpoint;
    }
    [self.tableView scrollRectToVisible:frame animated:YES];
}

Das scheint ganz gut zu funktionieren.

Beantwortet am 23/03/2009 um 02:49
quelle vom benutzer

stimmen
22

Die einfachste Lösung für Swift :

override func viewDidLoad() {
    super.viewDidLoad()

    searchBar?.becomeFirstResponder()
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.keyboardWillShow(_:)), name: UIKeyboardDidShowNotification, object: nil)
    NSNotificationCenter.defaultCenter().addObserver(self, selector: #selector(MyViewController.keyboardWillHide(_:)), name: UIKeyboardDidHideNotification, object: nil)
}

deinit {
    NSNotificationCenter.defaultCenter().removeObserver(self)
}

func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        if let keyboardHeight = userInfo[UIKeyboardFrameEndUserInfoKey]?.CGRectValue.size.height {
            tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardHeight, 0)
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    UIView.animateWithDuration(0.2, animations: { self.table_create_issue.contentInset = UIEdgeInsetsMake(0, 0, 0, 0) })
    // For some reason adding inset in keyboardWillShow is animated by itself but removing is not, that's why we have to use animateWithDuration here
    }
Beantwortet am 25/08/2015 um 06:42
quelle vom benutzer

stimmen
6

Ich hoffe , euch hat schon eine Lösung all diejenigen zu lesen. Aber ich fand meine Lösung wie folgt. Ich erwarte , dass Sie bereits eine Zelle haben mit UITextField. Also auf der Vorbereitung nur hält den Zeilenindex in das Tag-Textfeld ein .

cell.textField.tag = IndexPath.row;

Erstellen Sie ein activeTextField, Instanz UITextFieldmit globaler Reichweite wie folgt:

@interface EditViewController (){

    UITextField *activeTextField;

}

So, jetzt nur Sie kopieren meinen Code am Ende einfügen. Und auch nicht vergessen, hinzuzufügen,UITextFieldDelegate

#pragma mark - TextField Delegation

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField{

    activeTextField = textField;

    return YES;
}

- (void)textFieldDidEndEditing:(UITextField *)textField{

    activeTextField = nil;

}

Register Tastatur notifications

#pragma mark - Keyboard Activity

- (void)registerForKeyboardNotifications

{

    [[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWasShown:)

                                             name:UIKeyboardDidShowNotification object:nil];



    [[NSNotificationCenter defaultCenter] addObserver:self

                                         selector:@selector(keyboardWillBeHidden:)

                                             name:UIKeyboardWillHideNotification object:nil];



}

Griffe Keyboard Notifications:

Wird aufgerufen , wenn die UIKeyboardDidShowNotificationgesendet wird.

- (void)keyboardWasShown:(NSNotification*)aNotification

{

    NSDictionary* info = [aNotification userInfo];

    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;

    UIEdgeInsets contentInsets = UIEdgeInsetsMake(0.0, 0.0, kbSize.height, 0.0);

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

    NSIndexPath *currentRowIndex = [NSIndexPath indexPathForRow:activeTextField.tag inSection:0];

    [self.tableView scrollToRowAtIndexPath:currentRowIndex atScrollPosition:UITableViewScrollPositionTop animated:YES];

}

Wird aufgerufen , wenn die UIKeyboardWillHideNotificationgesendet wird ,

- (void)keyboardWillBeHidden:(NSNotification*)aNotification

{

    UIEdgeInsets contentInsets = UIEdgeInsetsZero;

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

}

Jetzt eine Sache bleibt, Rufen Sie das registerForKeyboardNotificationsVerfahren um ViewDidLoadVerfahren wie folgt:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Registering keyboard notification

    [self registerForKeyboardNotifications];

    // Your codes here...

}

Sie fertig sind, hoffen , dass Ihr textFieldsnicht mehr von der Tastatur versteckt.

Beantwortet am 03/01/2015 um 21:36
quelle vom benutzer

stimmen
6

Die Kombination und die freien Räume aus mehreren Antworten (insbesondere Ortwin Gentz, Benutzer 98013) und einen anderen Beitrag füllt, wird dies für SDK aus der Box arbeitet 4.3 auf einem iPad im Hochformat oder Querformat-Modus:

@implementation UIView (FindFirstResponder)
- (UIResponder *)findFirstResponder
{
  if (self.isFirstResponder) {        
    return self;     
  }

  for (UIView *subView in self.subviews) {
    UIResponder *firstResponder = [subView findFirstResponder];
    if (firstResponder != nil) {
      return firstResponder;
    }
  }

  return nil;
}
@end

@implementation MyViewController

- (UIResponder *)currentFirstResponder {
  return [self.view findFirstResponder];
}

- (IBAction)editingEnded:sender {
  [sender resignFirstResponder];
}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
  [textField resignFirstResponder];
  return NO;
}

- (void)textFieldDidBeginEditing:(UITextField *)textField {
  UITableViewCell *cell = (UITableViewCell*) [[textField superview] superview];
  [_tableView scrollToRowAtIndexPath:[_tableView indexPathForCell:cell] atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)keyboardWillShow:(NSNotification*)notification {
  if ([self currentFirstResponder] != nil) {
    NSDictionary* userInfo = [notification userInfo];

    // we don't use SDK constants here to be universally compatible with all SDKs ≥ 3.0
    NSValue* keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardBoundsUserInfoKey"];
    if (!keyboardFrameValue) {
      keyboardFrameValue = [userInfo objectForKey:@"UIKeyboardFrameEndUserInfoKey"];
    }

    // Reduce the tableView height by the part of the keyboard that actually covers the tableView
    CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
    CGRect viewRectAbsolute = [_tableView convertRect:_tableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
    CGRect frame = _tableView.frame;
    if (UIInterfaceOrientationLandscapeLeft == self.interfaceOrientation ||UIInterfaceOrientationLandscapeRight == self.interfaceOrientation ) {
      windowRect = CGRectMake(windowRect.origin.y, windowRect.origin.x, windowRect.size.height, windowRect.size.width);
      viewRectAbsolute = CGRectMake(viewRectAbsolute.origin.y, viewRectAbsolute.origin.x, viewRectAbsolute.size.height, viewRectAbsolute.size.width);
    }
    frame.size.height -= [keyboardFrameValue CGRectValue].size.height - CGRectGetMaxY(windowRect) + CGRectGetMaxY(viewRectAbsolute);

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    _tableView.frame = frame;
    [UIView commitAnimations];

    UITableViewCell *textFieldCell = (id)((UITextField *)self.currentFirstResponder).superview.superview;
    NSIndexPath *textFieldIndexPath = [_tableView indexPathForCell:textFieldCell];

    // iOS 3 sends hide and show notifications right after each other
    // when switching between textFields, so cancel -scrollToOldPosition requests
    [NSObject cancelPreviousPerformRequestsWithTarget:self];
    _topmostRowBeforeKeyboardWasShown = [[_tableView indexPathsForVisibleRows] objectAtIndex:0];
    [_tableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
  }
}

- (void) scrollToOldPosition {
  [_tableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
}

- (void)keyboardWillHide:(NSNotification*)notification {
  if ([self currentFirstResponder] != nil) {

    NSDictionary* userInfo = [notification userInfo];

    [UIView beginAnimations:nil context:NULL];
    [UIView setAnimationDuration:[[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue]];
    [UIView setAnimationCurve:[[userInfo objectForKey:UIKeyboardAnimationCurveUserInfoKey] intValue]];
    _tableView.frame = self.view.bounds;
    [UIView commitAnimations];

    [self performSelector:@selector(scrollToOldPosition) withObject:nil afterDelay:0.1];
  }
}   

@end
Beantwortet am 03/08/2011 um 03:35
quelle vom benutzer

stimmen
5

Mein Ansatz:

I Unterklasse UITextField erste und füge eine indexPath Eigenschaft. Im cellFor ... i die indexPath Eigenschaft übergeben Methode.

Dann füge ich folgenden Code:

UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:textField.indexPath];

CGPoint cellPoint = [cell convertPoint:textField.center toView:self.tableView];
[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, cellPoint.y-50);}];

zum textFieldShould / WillBegin ... etc.

Wenn die Tastatur verschwindet müssen Sie es umgekehrt mit:

[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, 0);}];
Beantwortet am 29/09/2012 um 13:03
quelle vom benutzer

stimmen
4

Verwenden UITextField's delegateMethode:

Schnell

func textFieldShouldBeginEditing(textField: UITextField) -> bool {
  let txtFieldPosition = textField.convertPoint(textField.bounds.origin, toView: yourTableViewHere)
  let indexPath = yourTablViewHere.indexPathForRowAtPoint(txtFieldPosition)
  if indexPath != nil {
     yourTablViewHere.scrollToRowAtIndexPath(indexPath!, atScrollPosition: .Top, animated: true)
  }
  return true
}

Ziel c

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
  CGPoint txtFieldPosition = [textField convertPoint:CGPointZero toView: yourTablViewHere];
  NSLog(@"Begin txtFieldPosition : %@",NSStringFromCGPoint(txtFieldPosition));
  NSIndexPath *indexPath = [yourTablViewHere indexPathForRowAtPoint:txtFieldPosition];

  if (indexPath != nil) {
     [yourTablViewHere scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
  }
  return YES;
}
Beantwortet am 20/03/2015 um 07:00
quelle vom benutzer

stimmen
4

Die richtige Antwort ist Sam Ho Antwort:

„Wenn Sie UITableViewController statt UIViewController verwenden, wird es automatisch so tun.“.

So stellen Sie sicher, dass Ihre UITableView auf die Tableview Eigenschaft des UITableViewController verbinden (so zB nicht hinzufügen, es als ein Subview der View-Eigenschaft des UITableViewController).

Auch stellen Sie sicher, die AutoresizingMask Eigentum Ihrer UITableView FlexibleHeight einstellen

Beantwortet am 09/12/2010 um 11:28
quelle vom benutzer

stimmen
4

Wenn Sie verwenden Three20, dann verwenden Sie die autoresizesForKeyboardEigenschaft. Setzen Sie einfach in der Ihrer Ansicht Controller - -initWithNibName:bundleMethode

self.autoresizesForKeyboard = YES

Diese kümmert sich um:

  1. Zuhören für Tastatur-Benachrichtigungen und Einstellen des Rahmen des Tabellenansicht
  2. Lauf auf den Ersthelfer

Gemacht und gemacht.

Beantwortet am 21/09/2010 um 14:19
quelle vom benutzer

stimmen
4

Tastatur-Benachrichtigungen arbeiten, aber Apple-Beispielcode für das davon ausgeht, dass die Bildlaufansicht der Stammansicht des Fensters ist. Dies ist in der Regel nicht der Fall. Sie müssen für Tab Bars zu kompensieren, usw., versetzt das Recht zu erhalten.

Es ist einfacher, als es klingt. Hier ist der Code, den ich in einem UITableViewController verwenden. Es verfügt über zwei Instanzvariablen, hiddenRect und keyboardShown.

// Called when the UIKeyboardDidShowNotification is sent.
- (void)keyboardWasShown:(NSNotification*)aNotification {
    if (keyboardShown)
        return;

    NSDictionary* info = [aNotification userInfo];

    // Get the frame of the keyboard.
    NSValue *centerValue = [info objectForKey:UIKeyboardCenterEndUserInfoKey];
    NSValue *boundsValue = [info objectForKey:UIKeyboardBoundsUserInfoKey];
    CGPoint keyboardCenter = [centerValue CGPointValue];
    CGRect keyboardBounds = [boundsValue CGRectValue];
    CGPoint keyboardOrigin = CGPointMake(keyboardCenter.x - keyboardBounds.size.width / 2.0,
                                         keyboardCenter.y - keyboardBounds.size.height / 2.0);
    CGRect keyboardScreenFrame = { keyboardOrigin, keyboardBounds.size };


    // Resize the scroll view.
    UIScrollView *scrollView = (UIScrollView *) self.tableView;
    CGRect viewFrame = scrollView.frame;
    CGRect keyboardFrame = [scrollView.superview convertRect:keyboardScreenFrame fromView:nil];
    hiddenRect = CGRectIntersection(viewFrame, keyboardFrame);

    CGRect remainder, slice;
    CGRectDivide(viewFrame, &slice, &remainder, CGRectGetHeight(hiddenRect), CGRectMaxYEdge);
    scrollView.frame = remainder;

    // Scroll the active text field into view.
    CGRect textFieldRect = [/* selected cell */ frame];
    [scrollView scrollRectToVisible:textFieldRect animated:YES];

    keyboardShown = YES;
}


// Called when the UIKeyboardDidHideNotification is sent
- (void)keyboardWasHidden:(NSNotification*)aNotification
{
    // Reset the height of the scroll view to its original value
    UIScrollView *scrollView = (UIScrollView *) self.tableView;
    CGRect viewFrame = [scrollView frame];
    scrollView.frame = CGRectUnion(viewFrame, hiddenRect);

    keyboardShown = NO;
}
Beantwortet am 11/07/2009 um 23:01
quelle vom benutzer

stimmen
4

Wenn Sie einen UITableView verwenden , um Ihre Textfelder zu platzieren ( von Jeff Lamarche ), können Sie nur die Tableview Scrollen des Delegatmethode wie so verwenden.

(Anmerkung: Meine Textfelder sind in einer Anordnung mit dem gleichen Index gespeichert, wie es in den tableview Reihe)

- (void) textFieldDidBeginEditing:(UITextField *)textField
    {

        int index;
        for(UITextField *aField in textFields){

            if (textField == aField){
                index = [textFields indexOfObject:aField]-1;
            }
        }

         if(index >= 0) 
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:index inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:YES];

        [super textFieldDidBeginEditing:textField];
    }
Beantwortet am 01/05/2009 um 07:09
quelle vom benutzer

stimmen
3

Eine stromlinienförmige Lösung. Es schlüpft in die UITextField Delegatmethoden, so ist es nicht erforderlich w / UIKeyboard Benachrichtigungen durcheinander.

Hinweise zur Anwendung:

kSettingsRowHeight - die Höhe eines UITableViewCell.

offsetTarget und offsetThreshold sind direkt an der kSettingsRowHeight baed. Wenn Sie eine andere Zeilenhöhe verwenden, diese Werte zu Punkt des y-Eigenschaft festgelegt. [Alt: Berechnung der in einer anderen Weise Offset-Reihe.]

- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField {
CGFloat offsetTarget    = 113.0f; // 3rd row
CGFloat offsetThreshold = 248.0f; // 6th row (i.e. 2nd-to-last row)

CGPoint point = [self.tableView convertPoint:CGPointZero fromView:textField];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGRect frame = self.tableView.frame;
if (point.y > offsetThreshold) {
    self.tableView.frame = CGRectMake(0.0f,
                      offsetTarget - point.y + kSettingsRowHeight,
                      frame.size.width,
                      frame.size.height);
} else if (point.y > offsetTarget) {
    self.tableView.frame = CGRectMake(0.0f,
                      offsetTarget - point.y,
                      frame.size.width,
                      frame.size.height);
} else {
    self.tableView.frame = CGRectMake(0.0f,
                      0.0f,
                      frame.size.width,
                      frame.size.height);
}

[UIView commitAnimations];

return YES;

}

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
[textField resignFirstResponder];

[UIView beginAnimations:nil context:nil];
[UIView setAnimationBeginsFromCurrentState:YES];
[UIView setAnimationDuration:0.2];
[UIView setAnimationCurve:UIViewAnimationCurveEaseOut];

CGRect frame = self.tableView.frame;
self.tableView.frame = CGRectMake(0.0f,
                  0.0f,
                  frame.size.width,
                  frame.size.height);

[UIView commitAnimations];

return YES;

}

Beantwortet am 04/08/2009 um 08:18
quelle vom benutzer

stimmen
3

Ich lief in so etwas wie Ihr Problem (ich einen Bildschirm ähnlich dem iPhone settings.app mit einem Bündel von bearbeitbaren Zellen wollte übereinander gestapelt) und stellte fest, dass dieser Ansatz gut funktioniert:

Schiebe UITextFields um zu vermeiden,

Beantwortet am 27/02/2009 um 15:17
quelle vom benutzer

stimmen
2

Ein Beispiel in Swift, den genauen Punkt des Textfeldes verwenden Get indexPath von UITextField in UITableViewCell mit Swift :

func textFieldDidBeginEditing(textField: UITextField) {
    let pointInTable = textField.convertPoint(textField.bounds.origin, toView: self.accountsTableView)
    let textFieldIndexPath = self.accountsTableView.indexPathForRowAtPoint(pointInTable)
    accountsTableView.scrollToRowAtIndexPath(textFieldIndexPath!, atScrollPosition: .Top, animated: true)
}
Beantwortet am 21/05/2015 um 06:34
quelle vom benutzer

stimmen
2

Sehr interessante Diskussion, ich sah sich auch das gleiche Problem ein schlimmer sein kann, weil

  1. Ich war mit einer benutzerdefinierten Zelle und das Textfeld war im Innern, dass.
  2. Ich hatte UIViewController zu verwenden, um meine Anforderungen zu erfüllen, so kippt Vorteil UITableViewController nehmen.
  3. Ich hatte Filter- / Sortierkriterien in meiner Tabellenzelle, dh ur Zellen halten über die Änderung und die Verfolgung des indexPath und alles wird nicht helfen.

So lesen Sie die Threads hier und umgesetzt meine Version, die mir geholfen , in Hochschieben meine Inhalte in iPad im Landschaftsmodus. Hier Code ist (dies ist nicht narrensicher und alle, aber es behoben mein Problem) Zuerst u brauchen einen Delegaten in Ihrer benutzerdefinierten Zellklasse haben, die auf die Bearbeitung beginnt, sendet das Textfeld zu ur Viewcontroller und stellen Sie die activefield = theTextField dort

// IMPLEMENTIERT NUR Landscape-Modus GRIFF

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbValue = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect aRect = myTable.frame;

    CGSize kbSize = CGSizeMake(kbValue.height, kbValue.width);

    aRect.size.height -= kbSize.height+50;
// This will the exact rect in which your textfield is present
        CGRect rect =  [myTable convertRect:activeField.bounds fromView:activeField];
// Scroll up only if required
    if (!CGRectContainsPoint(aRect, rect.origin) ) {


            [myTable setContentOffset:CGPointMake(0.0, rect.origin.y) animated:YES];

    }


}

// aufgerufen, wenn die UIKeyboardWillHideNotification gesendet wird

- (void)keyboardWillHide:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    myTable.contentInset = contentInsets;
    myTable.scrollIndicatorInsets = contentInsets;
    NSDictionary* info = [aNotification userInfo];
    CGSize kbValue = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGSize kbSize = CGSizeMake(kbValue.height, kbValue.width);
    CGRect bkgndRect = activeField.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [myTable setContentOffset:CGPointMake(0.0, 10.0) animated:YES];
}

-anoop4real

Beantwortet am 17/07/2012 um 18:11
quelle vom benutzer

stimmen
2

Diese soluton funktioniert für mich, bitte beachten Sie die Zeile

[tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height+160) animated:YES];

Sie können die 160 Wert ändern, es mit Ihnen übereinstimmen arbeiten

- (void)keyboardWasShown:(NSNotification*)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
                        bkgndRect.size.height += kbSize.height;
     [activeField.superview setFrame:bkgndRect];
     [tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height+160) animated:YES];
}

- (void)textFieldDidBeginEditing:(UITextField *)textField
{
   activeField = textField;
}
-(void)textFieldDidEndEditing:(UITextField *)textField
 {
     activeField = nil;
 }
// Called when the UIKeyboardWillHideNotification is sent
- (void)keyboardWillBeHidden:(NSNotification*)aNotification
{
    UIEdgeInsets contentInsets = UIEdgeInsetsZero;
    tableView.contentInset = contentInsets;
    tableView.scrollIndicatorInsets = contentInsets;
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = activeField.superview.frame;
    //bkgndRect.size.height += kbSize.height;
    [activeField.superview setFrame:bkgndRect];
    [tableView setContentOffset:CGPointMake(0.0, activeField.frame.origin.y-kbSize.height) animated:YES];
}
Beantwortet am 02/12/2011 um 19:28
quelle vom benutzer

stimmen
2

Da Sie Textfelder in einer Tabelle haben, ist der beste Weg, um wirklich auf den Tisch, um die Größe - Sie tableView.frame einstellen müssen von der Größe der Tastatur in der Höhe kleiner zu sein (man denke ich etwa 165 Pixel) und es dann wieder erweitern, wenn die Tastatur wird zurückgewiesen.

Sie können auch zu dieser Zeit für den Tableview auch deaktivieren Interaktion mit dem Benutzer optional, wenn der Benutzer Scrollen nicht wollen.

Beantwortet am 28/02/2009 um 19:37
quelle vom benutzer

stimmen
1

Kleine Variation mit Swift 4.2 ...

Auf meinem UITableView ich viele Abschnitte hatte , aber ich musste den Floating - Header Effekt vermeiden , so habe ich eine „ dummyViewHeight “ -Ansatz als irgendwo sonst hier auf Stack - Überlauf gesehen ... Also das ist meine Lösung für dieses Problem (es funktioniert auch für Tastatur + Symbolleiste + Vorschläge):

Erklären Sie es als Klasse Konstante:

let dummyViewHeight: CGFloat = 40.0

Dann

override func viewDidLoad() {
    super.viewDidLoad()
    //... some stuff here, not needed for this example

    // Create non floating header
    tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: tableView.bounds.size.width, height: dummyViewHeight))
    tableView.contentInset = UIEdgeInsets(top: -dummyViewHeight, left: 0, bottom: 0, right: 0)

    addObservers()
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    removeObservers()
}

Und hier die ganze Magie ...

@objc func keyboardWillShow(notification: NSNotification) {
    if let userInfo = notification.userInfo {
        let keyboardHeight = (userInfo[UIResponder.keyboardFrameEndUserInfoKey] as AnyObject).cgRectValue.size.height
        tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: dummyViewHeight))
        tableView.contentInset = UIEdgeInsets(top: -dummyViewHeight, left: 0, bottom: keyboardHeight, right: 0)
    }
}

@objc func keyboardWillHide(notification: NSNotification) {
    UIView.animate(withDuration: 0.25) {
        self.tableView.tableHeaderView = UIView(frame: CGRect(x: 0, y: 0, width: self.tableView.bounds.size.width, height: self.dummyViewHeight))
        self.tableView.contentInset = UIEdgeInsets(top: -self.dummyViewHeight, left: 0, bottom: 0, right: 0)
    }
}
Beantwortet am 08/10/2018 um 10:45
quelle vom benutzer

stimmen
1

in viewDidLoad

-(void)viewdidload{

[super viewdidload];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(keyboardWillChange:) name:UIKeyboardWillChangeFrameNotification object:nil];
}

    -(void)keyboardWillChange:(NSNotification*)sender{

        NSLog(@"keyboardwillchange sender %@",sender);

float margin=0  // set your own topmargin


        CGFloat originY = [[sender.userInfo objectForKey:UIKeyboardFrameEndUserInfoKey] CGRectValue].origin.y;


        if (originY >= self.view.frame.size.height){

            NSLog(@"keyboardclose");



            [tb_ setFrame:CGRectMake(0, margin, self.view.frame.size.width, self.view.frame.size.height-margin)];

        }else{

            NSLog(@"keyobard on");

            float adjustedHeight = self.view.frame.size.height - margin - (self.view.frame.size.height-originY);

            [tb_ setFrame:CGRectMake(0, margin, self.view.frame.size.width, adjustedHeight)];
        }







    }
Beantwortet am 12/02/2016 um 09:14
quelle vom benutzer

stimmen
1

Ich verwende diese, und sie arbeiten wie ein Zauber:

BSKeyboardControls - BSKeyboardControls Github

TPKeyboardAvoiding - TPKeyboardAvoiding Github

Beantwortet am 13/02/2014 um 09:30
quelle vom benutzer

stimmen
1

Ich benutze dies oft in meinen Projekten. Diese Lösung funktioniert mit scrollviews, Tableviews oder collectionviews und es ist einfach zu installieren. Es ist auch Haken automatisch auf „Next“ Tasten auf der Tastatur durch die Textfelder zu wechseln.

Prüfen Sie es hier

Beantwortet am 12/02/2014 um 21:27
quelle vom benutzer

stimmen
1

Ich werde meine Lösung (oder QuickDialog der das ist) in den Hut werfen. Im Grunde wartet auf das Scrollen zu animieren. Es wäre schön, die Tastatur Animation JIT statt der magischen Zahl zu erhalten.

-(void)textFieldDidBeginEditing:(UITextField *)textField
{
    if (textField == self.emailTextField) {
        NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 50 * USEC_PER_SEC);
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [self.tableView scrollToRowAtIndexPath:indexPath atScrollPosition:UITableViewScrollPositionTop animated:YES];
        });
    }
}
Beantwortet am 28/01/2014 um 19:05
quelle vom benutzer

stimmen
1

Einfache und schnelle Lösung.

Ich scrollen Sie einfach auf der rechten Seite Zelle, wenn Scrollen geschieht

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

Unter der Annahme, ich weiß Tabelle ist jetzt in diesem Modus „_keepMyCellOnTop“ & Ich weiß ausgewählte Zelle „_selectedCellIndex“ oder blättern Sie zu ausgewählten Zelle

- (void)scrollViewDidScroll:(UIScrollView *)scrollView 
{

    if (_keepMyCellOnTop)
    {
        [self.tableView scrollToRowAtIndexPath:_selectedCellIndex atScrollPosition:UITableViewScrollPositionTop animated:NO];
    }
}

Dies wird Scrollen verhindern.

Den Code Platzieren in -(void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView eine nach oben und unten führen

Beantwortet am 31/12/2013 um 13:37
quelle vom benutzer

stimmen
1

Ich habe gerade gelöst, ein solches Problem von mir, nachdem ich eine Masse von Lösungen via Google und Stack-Überlauf gefunden bezeichnet.

Erstens, versichern Sie sich bitte , dass Sie eine IBOutlet Ihrer UIScrollView einrichten, dann nehmen Sie bitte einen Blick auf Apple - Doc: Keyboard - Management . Schließlich, wenn Sie den Hintergrund bewegen können, aber die Tastatur abdeckt noch die Textfelder, werfen Sie bitte einen Blick auf dieses Stück Code:

// If active text field is hidden by keyboard, scroll it so it's visible
// Your application might not need or want this behavior.
CGRect aRect = self.view.frame;
aRect.size.height -= kbSize.height;

if (aRect.size.height < activeField.frame.origin.y+activeField.frame.size.height) {

    CGPoint scrollPoint = CGPointMake(0.0, activeField.frame.origin.y+activeField.frame.size.height-aRect.size.height);

    [scrollView setContentOffset:scrollPoint animated:YES];

Der wesentliche Unterschied zwischen diesem Stück und Apple liegt in der, wenn die Bedingung. Ich glaube, Apfel Berechnung der Scroll-Abstand und den Zustand, ob Textfeld mit der Tastatur abgedeckt sind nicht korrekt, so habe ich meine Modifikation wie oben.

Lass mich wissen ob es funktioniert

Beantwortet am 18/08/2012 um 11:10
quelle vom benutzer

stimmen
1

Hier ist, wie ich diese Arbeit gemacht, die eine Mischung aus Sam Ho und Marcel Ws Antworten ist, und einige meiner eigenen Fehlerkorrekturen vorgenommen meinen crappy Code. Ich war mit einem UITableViewController. Die Tabelle jetzt die Größe richtig, wenn die Tastatur angezeigt wird.

1) In viewDidLoadfügte ich hinzu:

self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

2) Ich hatte vergessen , die nennen superÄquivalente viewWillAppearund awakeFromNib. Ich fügte hinzu , diese wieder in.

Beantwortet am 26/07/2012 um 18:18
quelle vom benutzer

stimmen
1

Wenn Ihr UITableView durch eine Unterklasse von UITableViewController und nicht UITableView, und das Textfeld Delegierten ist die UITableViewController verwaltet wird, sollte es automatisch alle Scrollen verwalten - all diese anderen Kommentare nur sehr schwer in die Praxis umzusetzen.

siehe Für ein gutes Beispiel des Apfels Beispiel-Code-Projekt: TaggedLocations.

Sie können sehen, dass es scrollt automatisch, aber es scheint keinen Code zu sein, der dies tut. Dieses Projekt hat auch Aussicht Zellen benutzerdefinierte Tabelle, so dass, wenn Sie Ihre Anwendung mit ihm als Richtschnur bauen, sollten Sie das gewünschte Ergebnis erhalten.

Beantwortet am 05/03/2012 um 07:09
quelle vom benutzer

stimmen
1

Eine weitere einfache Methode (funktioniert nur mit einem Abschnitt)

//cellForRowAtIndexPath
UItextField *tf;
[cell addSubview:tf];
tf.tag = indexPath.row;
tf.delegate = self;

//textFieldDidBeginEditing:(UITextField *)text
[[self.tableView scrollToRowsAtIndexPath:[NSIndexPath indexPathForRow:text.tag in section:SECTIONINTEGER] animated:YES];
Beantwortet am 23/11/2011 um 17:25
quelle vom benutzer

stimmen
1

So nach stundenlangen zermürbenden Arbeit versucht , diese aktuellen Lösungen zu verwenden (und gar nicht an ) Ich habe endlich die Dinge gut funktioniert, und aktualisiert sie die neuen Animationsblöcke zu verwenden. Meine Antwort auf alleinig Ortwin Antwort oben .

Also aus irgendeinem Grunde über den Code funktioniert einfach nicht für mich. Mein Setup schien anderen ziemlich ähnlich, aber vielleicht, weil ich auf einem iPad oder 4,3 war ... keine Ahnung. Es wurde dabei einige verrückte Mathe und Schießen meine Tableview aus dem Bildschirm.

Siehe Endergebnis meiner Lösung: http://screencast.com/t/hjBCuRrPC (Bitte ignorieren Sie das Foto :-P) .

Also ging ich mit dem Kern von dem, was Ortwin tat, aber verändert, wie es war etwas Mathematik zu tun, den origin.y & Size.height meine Tabellenansicht mit der Höhe der Tastatur zu addieren. Wenn ich die Höhe des Fensters aus diesem Ergebnis subtrahieren, sagt es mir, wie viel Kreuzung habe ich los. Wenn es größer als 0 (aka gibt es einige Überschneidungen) führe ich die Animation der Rahmenhöhe.

Darüber hinaus gab es einige Probleme neu zu zeichnen, die von 1 gelöst wurden) Warten auf die Zelle scrollen, bis die Animation durchgeführt wurde und 2) unter Verwendung der UIViewAnimationOptionBeginFromCurrentState Option, wenn die Tastatur versteckt.

Ein paar Dinge zu beachten.

  • _topmostRowBeforeKeyboardWasShown & _originalFrame sind Instanzvariablen im Header deklariert.
  • self.guestEntryTableView ist meine Tableview (I in einer externen Datei bin)
  • IASKCGRectSwap ist Methode des Ortwin für die Koordinaten eines Rahmens Flipping
  • Ich aktualisiere nur die Höhe des Tableview, wenn mindestens 50px davon wird sich zeigen,
  • Da ich nicht in einem UIViewController bin habe ich nicht self.view, so dass ich nur die Tableview in seinen ursprünglichen Rahmen zurückkehren

Auch hier würde ich nicht in der Nähe von dieser Antwort bekommen, wenn ich Ortwin nicht den Kern der es vorsah. Hier ist der Code:

- (IBAction)textFieldDidBeginEditing:(UITextField *)textField
{
    self.activeTextField = textField;

    if ([self.guestEntryTableView indexPathsForVisibleRows].count) {
        _topmostRowBeforeKeyboardWasShown = (NSIndexPath*)[[self.guestEntryTableView indexPathsForVisibleRows] objectAtIndex:0];
    } else {
        // this should never happen
        _topmostRowBeforeKeyboardWasShown = [NSIndexPath indexPathForRow:0 inSection:0];
        [textField resignFirstResponder];
    }
}

- (IBAction)textFieldDidEndEditing:(UITextField *)textField
{
    self.activeTextField = nil;
}

- (void)keyboardWillShow:(NSNotification*)notification {
    NSDictionary* userInfo = [notification userInfo];

    NSValue* keyboardFrameValue = [userInfo objectForKey:UIKeyboardFrameEndUserInfoKey];

    // Reduce the tableView height by the part of the keyboard that actually covers the tableView
    UIInterfaceOrientation orientation = [[UIApplication sharedApplication] statusBarOrientation];
    CGRect windowRect = [[UIApplication sharedApplication] keyWindow].bounds;
    CGRect viewRectAbsolute = [self.guestEntryTableView convertRect:self.guestEntryTableView.bounds toView:[[UIApplication sharedApplication] keyWindow]];
    CGRect keyboardFrame = [keyboardFrameValue CGRectValue];
    if (UIInterfaceOrientationLandscapeLeft == orientation ||UIInterfaceOrientationLandscapeRight == orientation ) {
        windowRect = IASKCGRectSwap(windowRect);
        viewRectAbsolute = IASKCGRectSwap(viewRectAbsolute);
        keyboardFrame = IASKCGRectSwap(keyboardFrame);
    }

    // fix the coordinates of our rect to have a top left origin 0,0
    viewRectAbsolute = FixOriginRotation(viewRectAbsolute, orientation, windowRect.size.width, windowRect.size.height);

    CGRect frame = self.guestEntryTableView.frame;
    _originalFrame = self.guestEntryTableView.frame;

    int remainder = (viewRectAbsolute.origin.y + viewRectAbsolute.size.height + keyboardFrame.size.height) - windowRect.size.height;

    if (remainder > 0 && !(remainder > frame.size.height + 50)) {
        frame.size.height = frame.size.height - remainder;
        float duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
        [UIView animateWithDuration: duration
                        animations:^{
                            self.guestEntryTableView.frame = frame;
                        }
                        completion:^(BOOL finished){
                            UITableViewCell *textFieldCell = (UITableViewCell*) [[self.activeTextField superview] superview];
                            NSIndexPath *textFieldIndexPath = [self.guestEntryTableView indexPathForCell:textFieldCell];
                            [self.guestEntryTableView scrollToRowAtIndexPath:textFieldIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES];
                        }];
    }

}

- (void)keyboardWillHide:(NSNotification*)notification {
    NSDictionary* userInfo = [notification userInfo];
    float duration = [[userInfo objectForKey:UIKeyboardAnimationDurationUserInfoKey] doubleValue];
    [UIView animateWithDuration: duration
                          delay: 0.0
                        options: (UIViewAnimationOptionBeginFromCurrentState)
                     animations:^{
                         self.guestEntryTableView.frame = _originalFrame;
                     }
                     completion:^(BOOL finished){
                         [self.guestEntryTableView scrollToRowAtIndexPath:_topmostRowBeforeKeyboardWasShown atScrollPosition:UITableViewScrollPositionTop animated:YES];
                     }];

}   

#pragma mark CGRect Utility function
CGRect IASKCGRectSwap(CGRect rect) {
    CGRect newRect;
    newRect.origin.x = rect.origin.y;
    newRect.origin.y = rect.origin.x;
    newRect.size.width = rect.size.height;
    newRect.size.height = rect.size.width;
    return newRect;
}

CGRect FixOriginRotation(CGRect rect, UIInterfaceOrientation orientation, int parentWidth, int parentHeight) {
    CGRect newRect;
    switch(orientation)
    {
        case UIInterfaceOrientationLandscapeLeft:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), rect.origin.y, rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationLandscapeRight:
            newRect = CGRectMake(rect.origin.x, parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
        case UIInterfaceOrientationPortrait:
            newRect = rect;
            break;
        case UIInterfaceOrientationPortraitUpsideDown:
            newRect = CGRectMake(parentWidth - (rect.size.width + rect.origin.x), parentHeight - (rect.size.height + rect.origin.y), rect.size.width, rect.size.height);
            break;
    }
    return newRect;
}
Beantwortet am 18/07/2011 um 09:45
quelle vom benutzer

stimmen
1

Ich habe versucht, fast den gleichen Ansatz und kam für das gleiche mit einem einfacheren und kleineren Code auf. Ich habe eine IBOutlet iTextView und mit dem UITextView in der IB verbunden.

 -(void)keyboardWillShow:(NSNotification *)notification
    {
        NSLog(@"Keyboard");
        CGRect keyFrame = [[[notification userInfo]objectForKey:UIKeyboardFrameEndUserInfoKey]CGRectValue];

        [UIView beginAnimations:@"resize view" context:nil];
        [UIView setAnimationCurve:1];
        [UIView setAnimationDuration:1.0];
        CGRect frame = iTableView.frame;
        frame.size.height = frame.size.height -  keyFrame.size.height;
        iTableView.frame = frame;
        [iTableView scrollRectToVisible:frame animated:YES];
        [UIView commitAnimations];

    }
Beantwortet am 13/05/2011 um 06:00
quelle vom benutzer

stimmen
1

Das funktioniert perfekt, und auf dem iPad auch.

- (BOOL)textFieldShouldReturn:(UITextField *)textField 
{

    if(textField == textfield1){
            [accountName1TextField becomeFirstResponder];
        }else if(textField == textfield2){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield3 becomeFirstResponder];

        }else if(textField == textfield3){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:1 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield4 becomeFirstResponder];

        }else if(textField == textfield4){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:2 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield5 becomeFirstResponder];

        }else if(textField == textfield5){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:3 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield6 becomeFirstResponder];

        }else if(textField == textfield6){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:4 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield7 becomeFirstResponder];

        }else if(textField == textfield7){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:5 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield8 becomeFirstResponder];

        }else if(textField == textfield8){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:6 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textfield9 becomeFirstResponder];

        }else if(textField == textfield9){
            [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForRow:7 inSection:1] atScrollPosition:UITableViewScrollPositionTop animated:YES];
            [textField resignFirstResponder];
        }
Beantwortet am 23/10/2010 um 08:11
quelle vom benutzer

stimmen
0

Ich entdeckte, nur ein weiterer Fehler, wenn UITableViewController verwenden. Es war nicht Scrollen automatisch, wenn Tastatur auftaucht. Ich bemerkte, dass es wegen der contentInsetAdjustmentBehavior = .never auf UITableView war.

Beantwortet am 03/07/2019 um 21:30
quelle vom benutzer

stimmen
0

Lösung für Swift 3-4 mit Animationen und Tastaturrahmen-Wechsel:

Erstellen Sie zunächst ein Bool:

// MARK: - Private Properties
private var isKeyboardShowing = false

Zweitens fügen Beobachter zu den Systemtastatur Hinweise:

// MARK: - Overriding ViewController Life Cycle Methods
override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillShow), name: .UIKeyboardWillShow, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillHide), name: .UIKeyboardWillHide, object: nil)

    NotificationCenter.default.addObserver(self, selector: #selector(keyboardWillChangeFrame), name: .UIKeyboardWillChangeFrame, object: nil)
}

Drittens, bereiten Sie die Funktion Animation:

func adjustTableViewInsets(keyboardHeight: CGFloat, duration: NSNumber, curve: NSNumber){
    var extraHeight: CGFloat = 0
    if keyboardHeight > 0 {
        extraHeight = 20
        isKeyboardShowing = true
    } else {
        isKeyboardShowing = false
    }

    let contentInset = UIEdgeInsets(top: 0, left: 0, bottom: keyboardHeight   extraHeight, right: 0)
    func animateFunc() {
        //refresh constraints
        //self.view.layoutSubviews()
        tableView.contentInset = contentInset
    }

    UIView.animate(withDuration: TimeInterval(duration), delay: 0, options: [UIViewAnimationOptions(rawValue: UInt(curve))], animations: animateFunc, completion: nil)
}

Dann fügen Sie die Ziel / Aktionsmethoden (von den Beobachtern genannt):

// MARK: - Target/Selector Actions
func keyboardWillShow(notification: NSNotification) {
    if !isKeyboardShowing {
        if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = keyboardSize.height

            let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
            let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber

            adjustTableViewInsets(keyboardHeight: keyboardHeight, duration: duration, curve: curve)
        }
    }
}

func keyboardWillHide(notification: NSNotification) {
    let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
    let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber
    adjustTableViewInsets(keyboardHeight: 0, duration: duration, curve: curve)
}

func keyboardWillChangeFrame(notification: NSNotification) {
    if isKeyboardShowing {
        let duration = notification.userInfo?[UIKeyboardAnimationDurationUserInfoKey] as! NSNumber
        let curve = notification.userInfo?[UIKeyboardAnimationCurveUserInfoKey] as! NSNumber

        if let newKeyboardSize = (notification.userInfo?[UIKeyboardFrameEndUserInfoKey] as? NSValue)?.cgRectValue {
            let keyboardHeight = newKeyboardSize.height
            adjustTableViewInsets(keyboardHeight: keyboardHeight, duration: duration, curve: curve)
        }
    }
}

Schließlich vergessen Sie nicht, Beobachter in deinit zu entfernen oder in viewWillDisappear:

deinit {
    NotificationCenter.default.removeObserver(self)
}
Beantwortet am 10/06/2018 um 15:48
quelle vom benutzer

stimmen
0

Alle Berechnungen keine Notwendigkeit, Code unten verwenden wird es funktionieren: Dieser Code habe ich in meiner Customized UITableViewCell, es funktioniert:

override func viewDidLoad() {
super.viewDidLoad()

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillShow), name: NSNotification.Name.UIKeyboardWillShow, object: nil)

NotificationCenter.default.addObserver(self, selector: #selector(ViewController.keyboardWillHide), name: NSNotification.Name.UIKeyboardWillHide, object: nil)}


func keyboardWillShow(_ notification:Notification) {

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    tableView.contentInset = UIEdgeInsetsMake(0, 0, keyboardSize.height, 0)
}}


func keyboardWillHide(_ notification:Notification) {

if let keyboardSize = (notification.userInfo?[UIKeyboardFrameBeginUserInfoKey] as? NSValue)?.cgRectValue {
    tableView.contentInset = UIEdgeInsetsMake(0, 0, 0, 0)
}}
Beantwortet am 22/02/2018 um 07:47
quelle vom benutzer

stimmen
0

Swift 4 Komplettlösung:

  • Korrekt arbeitet mit Änderungen Tastaturrahmen (zB Tastaturhöhe wie emojii → normale Tastatur ändert).
  • TabBar- & ToolBar Unterstützung für UITableView Beispiel (bei anderen Beispielen Sie falsche Einsätze erhalten).
  • Dynamische Animation Dauer (nicht hartcodiert).
  • Protokoll-orientiert, so dass Sie leicht in jeder Situation nutzen können.
  • Scroll Einsätze funktionieren auch.

Ich schrieb Helfer - Protokoll (Sie es als herunterladen Kern , weil es zu groß ist auf Stackoverflow schreiben), so dass Ihre Ansicht muß nur:

  1. Adopt - KeyboardChangeFrameObserverProtokoll:

    func willChangeKeyboardFrame(height: CGFloat, animationDuration: TimeInterval, animationOptions: UIViewAnimationOptions)
    
  2. Rufen Sie observeKeyboardFrameChanges()an erscheinen.

Beispiel-Implementierung des Protokolls für Tableview:

class TestViewController: UITableViewController, KeyboardChangeFrameObserver {

    override func viewWillAppear(_ animated: Bool) {
        super.viewWillAppear(animated)

        observeKeyboardFrameChanges()
    }

    func willChangeKeyboardFrame(height: CGFloat, animationDuration: TimeInterval, animationOptions: UIViewAnimationOptions) {
        var adjustedHeight = height

        if let tabBarHeight = self.tabBarController?.tabBar.frame.height {
            adjustedHeight -= tabBarHeight
        } else if let toolbarHeight = navigationController?.toolbar.frame.height, navigationController?.isToolbarHidden == false {
            adjustedHeight -= toolbarHeight
        }

        if adjustedHeight < 0 { adjustedHeight = 0 }

        UIView.animate(withDuration: animationDuration, animations: {
            let newInsets = UIEdgeInsets(top: 0, left: 0, bottom: adjustedHeight, right: 0)
            self.tableView.contentInset = newInsets
            self.tableView.scrollIndicatorInsets = newInsets
        })
    }

}
Beantwortet am 12/01/2018 um 00:10
quelle vom benutzer

stimmen
0
// scroll tableview so content ends at the middle of the tableview (out of the way of the keyboard)
CGPoint newContentOffset = CGPointMake(0, [self.tableView contentSize].height - (self.tableView.bounds.size.height / 2));
[self.tableView setContentOffset:newContentOffset animated:YES];
Beantwortet am 27/06/2017 um 21:12
quelle vom benutzer

stimmen
0

Sehen Sie sich meine Version :)

    - (void)keyboardWasShown:(NSNotification *)aNotification
{
    NSDictionary* info = [aNotification userInfo];
    CGSize kbSize = [[info objectForKey:UIKeyboardFrameBeginUserInfoKey] CGRectValue].size;
    CGRect bkgndRect = cellSelected.superview.frame;
    bkgndRect.size.height += kbSize.height;
    [cellSelected.superview setFrame:bkgndRect];
    [tableView setContentOffset:CGPointMake(0.0, cellSelected.frame.origin.y-kbSize.height) animated:YES];
}


- (void)keyboardWasHidden:(NSNotification *)aNotification
{
    [tableView setContentOffset:CGPointMake(0.0, 0.0) animated:YES];
}
Beantwortet am 02/07/2016 um 20:32
quelle vom benutzer

stimmen
0

Hier ist meine Lösung von „Ereignis bearbeiten“ Bildschirm inspiriert von iOS7 Kalender-App.

Einer der wichtigsten Punkte dieser Lösung ist, dass Tastatur, wenn der Benutzer scrollt Tabelle des Feldes verwiesen.

Implementierung:

1) In Eigenschaft, die ausgewählte Textfeld speichert:

@property (strong) UITextField *currentTextField;

und BOOL Variable, die wir verwenden werden prüfen, ob wir Tastatur, wenn der Benutzer scrollt Tisch zu verstecken brauchen.

BOOL hideKeyboardOnScroll;

2) Handgriff UITextField delegieren Rückrufe:

#pragma mark - UITextFieldDelegate

- (void) textFieldDidBeginEditing: (UITextField *) textField {
    self.currentTextField = textField;
}

- (void) textFieldDidEndEditing: (UITextField *) textField {
    self.currentTextField = nil;
}

- (BOOL) textFieldShouldReturn: (UITextField *) textField {
   [textField resignFirstResponder];

    CGPoint newContentOffset = CGPointZero;
    if (tableView.contentSize.height > tableView.frame.size.height) {
        newContentOffset.y = MIN(tableView.contentOffset.y, tableView.contentSize.height - tableView.frame.size.height);
    }
    [tableView setContentOffset: newContentOffset animated: YES];

    return YES;
}

3) Handgriff UIScrollViewDelegate Methode dieser Benutzer scroll Ansicht zu überprüfen.

#pragma mark - UIScrollViewDelegate

- (void) scrollViewDidScroll: (UIScrollView *) scrollView {
    if (hideKeyboardOnScroll == YES) {
        [self.currentTextField resignFirstResponder];
    }
}

4) Anzeige-Tastatur-Benachrichtigungen in dem Viewcontroller [viewWillAppear] Verfahren und austragen in [viewWillDisappear] Methode.

- (void) viewWillAppear: (BOOL) animated {
    [super viewWillAppear: animated];

    [ [NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillShow:)
                                                  name: UIKeyboardWillShowNotification object: nil];
    [ [NSNotificationCenter defaultCenter] addObserver: self selector: @selector(keyboardWillHide:)
                                                  name: UIKeyboardWillHideNotification object: nil];
}

- (void) viewWillDisappear: (BOOL) animated {
    [super viewWillDisappear: animated];

    [ [NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardDidShowNotification object: nil];
    [ [NSNotificationCenter defaultCenter] removeObserver: self name: UIKeyboardWillHideNotification object: nil];    
}

5) Handgriff-Tastatur-Benachrichtigungen:

- (void) keyboardWillShow: (NSNotification *) notification {
    CGRect keyboardFrame = [ [ [notification userInfo] objectForKey: UIKeyboardFrameBeginUserInfoKey] CGRectValue];

    // Find cell with textfield.
    CGRect textFieldFrame = [tableView convertRect: self.currentTextField.frame fromView: self.currentTextField];
    NSIndexPath *indexPath = [tableView indexPathForRowAtPoint: textFieldFrame.origin];
    UITableViewCell *cell = [tableView cellForRowAtIndexPath: indexPath];
    //

    // Shrink tableView size.
    CGRect tableViewFrame = tableView.frame;
    tableView.frame = CGRectMake(tableView.frame.origin.x, tableView.frame.origin.y, tableView.frame.size.width,
                             self.view.frame.size.height - tableView.frame.origin.y - keyboardFrame.size.height);
    //

    // Check if cell is visible in shrinked table size.
    BOOL cellIsFullyVisible = YES;
    if ( cell.frame.origin.y < tableView.contentOffset.y ||
        (cell.frame.origin.y + cell.frame.size.height) > (tableView.contentOffset.y + tableView.frame.size.height) ) {
        cellIsFullyVisible = NO;
    }
    //

    // If cell is not fully visible when scroll table to show cell;
    if (cellIsFullyVisible == NO) {
        CGPoint contentOffset = CGPointMake(tableView.contentOffset.x, CGRectGetMaxY(cell.frame) - tableView.frame.size.height);
        if (cell.frame.origin.y < tableView.contentOffset.y) {
            contentOffset.y = cell.frame.origin.y;
        }
        contentOffset.y = MAX(0, contentOffset.y);

        // For some reason [setContentOffset] is called without delay then
        // this code may not work for some cells. That why we call it with brief delay.
        dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC));
        dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            [UIView animateWithDuration: 0.5 animations:^{
                [tableView setContentOffset: contentOffset animated: NO];
            } completion: ^(BOOL finished) {
                hideKeyboardOnScroll = YES;
            }];
        });
    } else {
        hideKeyboardOnScroll = YES;
    }
    //

    // Finally restore original table frame.
    tableView.frame = tableViewFrame;
    //
}

- (void) keyboardWillHide: (NSNotification *) notification {
    [super keyboardWillHide: notification];

    hideKeyboardOnScroll = NO;
}
Beantwortet am 21/08/2014 um 15:43
quelle vom benutzer

stimmen
0

Ich denke, der beste Weg, durch UITableViewController ist.

Wenn Sie ein UITableView in einem UIViewController wollen , machen nur einen InhaltAlle mit einem eingebetteten UITableViewController und setzen Sie die folgenden Zeilen in der viedDidLoad des UIViewController:

self.tableView = ((UITableViewController*)self.childViewControllers[0]).tableView;
self.tableView.delegate = self;
self.tableView.dataSource = self;

Einfach ;)

Beantwortet am 06/06/2014 um 16:29
quelle vom benutzer

stimmen
0

Ich denke , es gibt keinen „richtigen“ Weg , dies zu tun. Sie haben die beste Lösung Lösung für Ihren Anwendungsfall zu wählen. In meinem iPad App habe ich eine , UIViewControllerdie präsentiert wird modal wie UIModalPresentationFormSheetund besteht aus ein UITableView. Diese Tabelle enthält zwei UITextFieldspro Zelle. Nur Aufruf scrollToRowAtIndexPath:atScrollPosition:animated:der textFieldDidBeginEditing:Methode für mich nicht funktioniert. Deshalb habe ich ein erstellt tableFooterView:

- (void)viewDidLoad
{
    [super viewDidLoad];

    m_footerView = [[UIView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, m_tableView.frame.size.width, 300.0f)];
    [m_footerView setBackgroundColor:[UIColor clearColor]];
    [m_tableView setTableFooterView:m_footerView];
    [m_footerView release];
}

Die Idee ist , dass Tastatur blendet das tableFooterViewund nicht die UITextFields. Also das tableFooterViewmuss hoch genug sein. Danach können Sie verwenden , scrollToRowAtIndexPath:atScrollPosition:animated:in dem textFieldDidBeginEditing:Verfahren.

Ich denke , es ist auch möglich , die ein- und ausblenden tableFooterViewdynamisch durch die Beobachter für die Tastatur Mitteilungen hinzugefügt , aber ich habe es noch nicht ausprobiert:

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillShow:) 
                                                 name:UIKeyboardWillShowNotification 
                                               object:nil];
    [[NSNotificationCenter defaultCenter] addObserver:self 
                                             selector:@selector(keyboardWillHide:) 
                                                 name:UIKeyboardWillHideNotification 
                                               object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification 
{
     [m_tableView setTableFooterView:m_footerView];
}

- (void)keyboardWillHide:(NSNotification *)notification 
{
     [m_tableView setTableFooterView:nil];
}

- (void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];

    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillHideNotification object:nil];
}
Beantwortet am 15/09/2012 um 08:51
quelle vom benutzer

stimmen
0

ich habe ein kleines Projekt erstellen, das dieses Problem mit der Tastatur löst, in meinem Fall muß ich nur die Tabellenansicht gehen lassen, wenn die Tastatur erscheint.

Hoffe das hilft!

http://git.io/BrH9eQ

Beantwortet am 19/11/2011 um 21:21
quelle vom benutzer

stimmen
0

Ich schaute wieder in die iOS 5.0 lib Referenz und fand dieser Abschnitt mit dem Titel „Moving Inhalt , das unter der Tastatur befindet sich“: TextAndWebiPhoneOS KeyboardManagement

Ist die neue seit iOS 5, vielleicht? Ich habe nicht in sie noch lesen, wie ich in der Mitte von etwas bin anders, aber vielleicht andere wissen mehr und kann mich und andere hier aufklären.

Hat das Apple-doc ersetzen, was hier diskutiert worden ist oder sind die Informationen hier noch nützlich zu iOS 5 SDK-Benutzer?

Beantwortet am 26/10/2011 um 12:07
quelle vom benutzer

stimmen
0

UITableViewControllerautomatisch funktioniert das Scrolling, in der Tat. Der Unterschied im Vergleich zur Verwendung einer UIViewControllerist, dass Sie Navbar-Buttonitem programmatisch mithilfe der erstellen haben NavigationController, bei der Verwendung ein TableViewController.

Beantwortet am 20/03/2011 um 20:59
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more