Csinálok egy UITableView görgetést szöveg van kijelölve

szavazat
228

Miután a sok próbálgatás, én feladom, és azt kérdezi a kérdést. Láttam egy csomó ember hasonló problémákkal, de nem tud minden kérdésre választ helyes működése.

Van egy UITableView, amely áll az egyéni sejtek. A sejteket készülnek 5 szöveges mezők egymás mellett (fajta, mint egy rács).

Amikor megpróbáljuk görgetni, és módosítsa a sejtek alján az UITableView, nem tudom sikerül én sejtek megfelelő helyzetben a billentyűzet felett.

Láttam sok választ beszélünk változó nézet méretben, stb ... de ezek egyike sem működött szépen eddig.

Lehet bárki tisztázzák a „megfelelő” módon, hogy ezt egy konkrét kódpéldát?

A kérdést 27/02/2009 11:05
a forrás felhasználó
Más nyelveken...                            


48 válasz

szavazat
110

Ha UITableViewController helyett UIViewController, akkor automatikusan megtenni.

Válaszolt 21/09/2010 04:42
a forrás felhasználó

szavazat
89

A funkció, hogy nem a görgetés lehetne sokkal egyszerűbb:

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

Ez az. Nem számítások egyáltalán.

Válaszolt 15/04/2009 13:21
a forrás felhasználó

szavazat
65

Csinálok valamit nagyon hasonlít ez általános, nem kell számítani valami specifikus kódot. Csak nézd a megjegyzések a kódot:

A 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

A 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+ verzió:

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()
        }
    }
}
Válaszolt 13/04/2010 15:46
a forrás felhasználó

szavazat
41

Ugyanez volt a probléma, de észrevette, hogy úgy tűnik, csak egy nézetet. Így kezdtem keresni a különbségeket a vezérlők.

Megtudtam, hogy a görgetés viselkedését van beállítva - (void)viewWillAppear:(BOOL)animateda szuper példány.

Tehát biztos, hogy végre, mint ez:

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

És nem számít, ha UIViewControllervagy UITableViewController; ellenőrizni úgy, hogy egy UITableViewa subview a self.view az UIViewController. Ugyanez volt a viselkedése. A látvány nem tette lehetővé, hogy lépjünk, ha a hívás [super viewWillAppear:animated];hiányzott.

Válaszolt 29/05/2011 01:42
a forrás felhasználó

szavazat
37

én is kimaradt ez, mivel nem olvastam az egész post itt, de amit én találtam ki tűnik megtévesztően egyszerű. én nem, hogy ezt a présen, tesztelés minden helyzetben, de úgy tűnik, mintha jól működnek.

Egyszerűen állítsa be a contentInset a Tableview a magassága a billentyűzeten, majd lapozzunk a cella aljára:

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

és természetesen

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

ez túl egyszerű? lemaradtam valamiről? Eddig ez nekem dolgozik finom, de mint mondtam, én még nem tette át a présen ...

Válaszolt 18/08/2012 01:12
a forrás felhasználó

szavazat
35

A legegyszerűbb megoldás a Swift 3 alapuló Bartłomiej Semańczyk megoldás :

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)
    })
}
Válaszolt 08/12/2016 13:26
a forrás felhasználó

szavazat
34

Ha tudod használni UITableViewController, akkor kap a funkcionalitást ingyenes. Előfordul azonban, hogy ez nem egy lehetőség, különösen, ha szüksége van több nézet nem csak az UITableView.

Néhány megoldás itt bemutatott nem működnek iOS ≥4, valamelyik nem működik az iPad vagy fekvő módban, néhány nem működik a Bluetooth-billentyűzetek (ahol nem akarunk semmilyen görgetés), mások nem működik, ha a váltás között több szöveges mezők. Tehát, ha úgy dönt, minden olyan megoldást, hogy győződjön meg arról, hogy teszteljék ezeket az eseteket. Ez az a megoldás, amit használnak használt 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];
    }
}   

Itt a teljes kód az osztály a InAppSettingsKit. Próbálni, használja a „teljes listája” gyermek panelbe, ahol meg lehet próbálni a forgatókönyvek a fent említett.

Válaszolt 13/12/2010 17:01
a forrás felhasználó

szavazat
34

Azt hiszem, jön a megoldás, hogy megfeleljen a viselkedését Apple alkalmazásokat.

Először is, a viewWillAppear: iratkozz fel a billentyűzetet értesítést, hogy tudd, mikor a billentyűzet megjelenítése és elrejtése, és a rendszer megmondja a méret a billentyűzet, de ne”elfelejtette regisztrációját a viewWillDisappear :.

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

Végre kell hajtani a hasonló módszerekkel az alábbi úgy, hogy állítsa be a méretet a Tableview, hogy megfeleljen a látható területen, ha a billentyűzetet mutatja. Itt vagyok állapotát követve a billentyűzet külön, így tudok választani, ha beállítani a Tableview vissza teljes magasságú magam, mert kapsz ilyen értesítéseket minden területen változást. Ne felejtsük el, hogy végre keyboardWillHide: és válassza valahol helyénvaló rögzíteni a Tableview méretét.

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

Most itt van a görgetés kicsit dolgozunk ki néhány méretben az első, akkor azt látjuk, hol vagyunk a látható területen, és állítsa be a len akarunk lapozzunk, hogy akár a fele véli alatt vagy felett a közepén a szöveges mező alapján hol ez a nézet. Ebben az esetben van egy sor UITextFields és enum, amely nyomon követi őket, így megszorozzuk a rowHeight a sor számát adja nekünk a tényleges eltolás a keret ezen belül a külső nézetben.

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

Ez úgy tűnik, működik elég szépen.

Válaszolt 23/03/2009 02:49
a forrás felhasználó

szavazat
22

A legegyszerűbb megoldás a 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
    }
Válaszolt 25/08/2015 06:42
a forrás felhasználó

szavazat
6

Remélem nektek már van egy megoldás olvasás mindazok. De találtam én megoldásom a következő. Várom, hogy már van egy sejtet UITextField. Így a felkészülés csak tartsa sorindex a beviteli mezőbe a tag.

cell.textField.tag = IndexPath.row;

Hozzon létre egy activeTextField, példányának UITextFieldglobális köre az alábbiak szerint:

@interface EditViewController (){

    UITextField *activeTextField;

}

Szóval, most már csak másold be a kódomat a végén. És ne felejtsük el, hogy adjunkUITextFieldDelegate

#pragma mark - TextField Delegation

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

    activeTextField = textField;

    return YES;
}

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

    activeTextField = nil;

}

regiszterek billentyűzet 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];



}

Fogantyúk billentyűzet Notifications:

Meghívásra, ha a UIKeyboardDidShowNotificationküldött.

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

}

Meghívásra, ha a UIKeyboardWillHideNotificationküldött

- (void)keyboardWillBeHidden:(NSNotification*)aNotification

{

    UIEdgeInsets contentInsets = UIEdgeInsetsZero;

    [self.tableView setContentInset:contentInsets];

    [self.tableView setScrollIndicatorInsets:contentInsets];

}

Most egy dolog van hátra, hívja a registerForKeyboardNotificationsmódszert, hogy ViewDidLoada módszer a következő:

- (void)viewDidLoad {

    [super viewDidLoad];

    // Registering keyboard notification

    [self registerForKeyboardNotifications];

    // Your codes here...

}

Kész, remélem, a textFieldsjövőben nem rejti el a billentyűzetet.

Válaszolt 03/01/2015 21:36
a forrás felhasználó

szavazat
6

Ötvözi és kitölti az üres helyeket több választ (különösen Ortwin Gentz, használati 98013) és egy másik poszt, ez működni fog ki a dobozból SDK 4.3 egy iPad Álló vagy Fekvő mód:

@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
Válaszolt 03/08/2011 03:35
a forrás felhasználó

szavazat
5

Saját megközelítés:

Először alosztályba UITextField, és adjunk hozzá egy indexPath tulajdon. A cellFor ... Módszer i átadja a indexPath tulajdonság.

Aztán hozzá következő kódot:

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

A textFieldShould / WillBegin ... stb.

Amikor a billentyűzet eltűnik van megfordítani azt:

[UIView animateWithDuration:0.3 animations:^(void){self.tableView.contentOffset = CGPointMake(0, 0);}];
Válaszolt 29/09/2012 13:03
a forrás felhasználó

szavazat
4

Használja UITextField's delegatemódszer:

Gyors

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
}

Objective-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;
}
Válaszolt 20/03/2015 07:00
a forrás felhasználó

szavazat
4

A helyes válasz Sam Ho válasza:

„Ha UITableViewController helyett UIViewController, akkor automatikusan megtenni.”.

Csak győződjön meg róla, hogy csatlakoztassa a UITableView a Tableview tulajdonsága UITableViewController (így például nem adja hozzá a subview a nézet tulajdona UITableViewController).

Szintén fontos, hogy megadja a AutoresizingMask ingatlan a UITableView hogy FlexibleHeight

Válaszolt 09/12/2010 11:28
a forrás felhasználó

szavazat
4

Ha Three20, majd a autoresizesForKeyboardtulajdonság. Csak állítsa be a Ön szerint vezérlő -initWithNibName:bundleeljárás

self.autoresizesForKeyboard = YES

Ez gondoskodik:

  1. Hallgatva a billentyűzet bejelentések és beállítása az asztal nézet keretben
  2. Görgetés az első válaszadó

Kész és kész.

Válaszolt 21/09/2010 14:19
a forrás felhasználó

szavazat
4

Billentyűzet értesítések működik, de az Apple mintakódunkat azt feltételezi, hogy a tekercset nézet gyökérnézetéhez az ablakon. Ez általában nem ez a helyzet. Be kell, hogy kompenzálja a fül bárok, stb, hogy a megfelelő eltolás.

Ez könnyebb, mint amilyennek hangzik. Itt a kód azt használja egy UITableViewController. Két példány változók hiddenRect és 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;
}
Válaszolt 11/07/2009 23:01
a forrás felhasználó

szavazat
4

Ha egy uitableview helyezze el szövegmezők ( Jeff Lamarche ), akkor csak görgetni a Tableview a küldött módszer, mint így.

(Megjegyzés: a szöveges mezők tömb tárolja az azonos indexű hiszen sorra a Tableview)

- (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];
    }
Válaszolt 01/05/2009 07:09
a forrás felhasználó

szavazat
3

Egy több stream-bélelt megoldást. Ez befér a UITextField küldött módszereket, így nem igényel Messiás w / UIKeyboard értesítéseket.

Megvalósítás megjegyzések:

kSettingsRowHeight - a magassága egy UITableViewCell.

offsetTarget és offsetThreshold vannak baed le kSettingsRowHeight. Ha egy másik sormagasság beállításához ezeket az értékeket pont Y tulajdon. [Alt: kiszámítja a sorban eltolás eltérő módon.]

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

}

Válaszolt 04/08/2009 08:18
a forrás felhasználó

szavazat
3

Belefutottam valami hasonló a problémája (akartam hasonló képernyő az iPhone settings.app egy csomó szerkeszthető sejtek halmozott tetejére egy másik), és úgy találta, hogy ez a megközelítés jól működött:

csúszó uitextfields körül, hogy elkerüljék

Válaszolt 27/02/2009 15:17
a forrás felhasználó

szavazat
2

Egy példa a Swift, a pontos helye a szöveg mező Get indexPath a UITextField a UITableViewCell 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)
}
Válaszolt 21/05/2015 06:34
a forrás felhasználó

szavazat
2

Nagyon érdekes vita téma, én is szembe ugyanezzel a problémával lehet rosszabb egy, mert

  1. Én egy egyedi sejt és a textfield volt benne, hogy a.
  2. Kellett használni UIViewController, hogy megfeleljen a követelményeknek, így vidám kihasználni UITableViewController.
  3. Volt filter / rendezési kritériumot én táblázatcellába, azaz ur sejtek folyamatosan változik és nyomon követése a indexpath és minden nem fog segíteni.

Tehát olvasni a szálak itt és végre az én verzióm, ami segített nyomja fel a tartalmát iPad táj mód. Itt látható kódot (ez nem bolond bizonyíték, meg minden, de ez fix én problémám) Először u kell, hogy egy küldött az egyéni sejt osztály, amely a szerkesztés kezdődik, elküldi az textfield ur viewcontroller és állítsa be a activefield = theTextField ott

// végrehajtott FOGANTYÚ TÁJ mód csak a

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

    }


}

// hívott, amikor a UIKeyboardWillHideNotification küldik

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

Válaszolt 17/07/2012 18:11
a forrás felhasználó

szavazat
2

Ez oldalhoz adjuk nekem dolgozik, kérjük, vegye figyelembe a vonal

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

Meg lehet változtatni a 160 értéket hozzárendelni dolgozni,

- (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];
}
Válaszolt 02/12/2011 19:28
a forrás felhasználó

szavazat
2

Mivel van szövegmezők egy táblázatban, a legjobb módja valóban átméretezni az asztalt - be kell állítani a tableView.frame hogy magassága kisebb a mérete a billentyűzet (azt hiszem körülbelül 165 pixel), majd bontsa meg újra, amikor a billentyűzet elutasítja.

Tetszés szerint is letilthatja a felhasználói interakció az Tableview akkoriban is, ha nem akarjuk, hogy a felhasználó görgetés.

Válaszolt 28/02/2009 19:37
a forrás felhasználó

szavazat
1

Kis variáció Swift 4.2 ...

Az én UITableView nagyon sok szakaszok, de meg kellett kerülni a lebegő fejlécet hatás így használtam a „ dummyViewHeight ” megközelítés ahogy máshol itt Veremtúlcsordulás ... Tehát ez az én megoldásom erre a problémára (ez működik is billentyűzet + eszköztár + javaslatok):

Deklarálja azt osztály állandó:

let dummyViewHeight: CGFloat = 40.0

Azután

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

És itt a varázslat ...

@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)
    }
}
Válaszolt 08/10/2018 10:45
a forrás felhasználó

szavazat
1

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







    }
Válaszolt 12/02/2016 09:14
a forrás felhasználó

szavazat
1

Én ezekkel, és a munka, mint a karikacsapás:

BSKeyboardControls - BSKeyboardControls GitHub

TPKeyboardAvoiding - TPKeyboardAvoiding GitHub

Válaszolt 13/02/2014 09:30
a forrás felhasználó

szavazat
1

Én ezt sokszor az én projektekben. Ez a megoldás működik scrollviews, tableviews vagy collectionviews és könnyű telepítést. Ez is automatikusan összekapcsolódnak a „Tovább” gomb a billentyűzeten megnyomva a szövegmezőt.

Nézd meg itt

Válaszolt 12/02/2014 21:27
a forrás felhasználó

szavazat
1

Fogom dobni a megoldás (Vagy QuickDialog azon, hogy az) a kalapot. Alapvetően várni, hogy animálni a görgetés. Jó lenne, hogy a billentyűzet animáció JIT helyett a bűvös szám.

-(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];
        });
    }
}
Válaszolt 28/01/2014 19:05
a forrás felhasználó

szavazat
1

Egyszerű és gyors megoldást.

Csak lapozzunk a megfelelő cellába, amikor görgetés történik

    - (void)scrollViewDidScroll:(UIScrollView *)scrollView 

Feltételezve tudom táblázat most ebben az üzemmódban „_keepMyCellOnTop” & Tudom kijelölt cella „_selectedCellIndex” vagy lapozzunk kijelölt cella

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

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

Ez megakadályozza, hogy a görgetés.

Elhelyezése kódot -(void) scrollViewDidEndScrollingAnimation:(UIScrollView *)scrollView eredményez egy tekercset fel és le

Válaszolt 31/12/2013 13:37
a forrás felhasználó

szavazat
1

Épp most megoldódott ez a probléma magam után utaltam tömegű megoldásokat talált a Google és Veremtúlcsordulás.

Először is, kérjük Biztosítjuk, hogy létrehoztak egy IBOutlet a UIScrollView, akkor kérjük, hogy egy közeli pillantást Apple Doc: Keyboard Management . Végül, ha lehet görgetni a háttérben, de a billentyűzet is kiterjed a mezőket, kérjük, vessen egy pillantást a kódot:

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

A fő különbség a darabot, és az Apple rejlik a sérült állapota. Úgy vélem, az Apple kiszámítása scroll távolság és állapotát, hogy a szöveges hatálya alá tartozó területen a billentyűzet nem pontosak, ezért tettem módosítását a fentiek szerint.

Hadd tudja, ha ez működik

Válaszolt 18/08/2012 11:10
a forrás felhasználó

szavazat
1

Itt van, hogyan készült ez a munka, amely keveréke Sam Ho és Marcel W válaszait, és néhány saját hibajavítást tett az én gagyi kódot. Én egy UITableViewController. A táblázat most átméretezi helyesen, ha a billentyűzet látható.

1) Az viewDidLoadI. hozzá:

self.tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight;

2) Azt már elfelejtette, hogy hívja a superegyenérték viewWillAppearés awakeFromNib. Én hozzá ezeket vissza.

Válaszolt 26/07/2012 18:18
a forrás felhasználó

szavazat
1

Ha a UITableView kezeli egy alosztálya UITableViewController és nem UITableView, és a szöveg mező delegált a UITableViewController, meg kell kezelni az összes görgetés automatikusan - az összes többi hozzászólások nagyon nehéz megvalósítani a gyakorlatban.

Egy jó példa lásd az alma mintakódjának projekt: TaggedLocations.

Láthatjuk, hogy görgeti automatikusan, de nem úgy tűnik, hogy bármilyen kódot, ez. Ez a projekt is szokás táblanézet sejteket, így ha építeni az alkalmazást, mint egy útmutató, akkor kap a kívánt eredményt.

Válaszolt 05/03/2012 07:09
a forrás felhasználó

szavazat
1

Egy másik egyszerű módszer (csak az egyik felét)

//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];
Válaszolt 23/11/2011 17:25
a forrás felhasználó

szavazat
1

Tehát többórás fárasztó munka akarják használni ezeket jelenlegi megoldások (és teljesen sikertelen) Végre megvan a dolgok jól működnek, és frissíteni őket, hogy használják az új animációs blokk. A válaszom teljes mértékben a Ortwin válasza felett .

Tehát bármilyen okból a fenti kódot csak nem működik nekem. Saját beállítás tűnt meglehetősen hasonlít a többi, de talán azért, mert én egy iPad vagy 4.3 ... nem tudom. Azt csinál valami szokatlan matematikai és a forgatás én Tableview ki a képernyőn.

Lásd végeredmény az én megoldás: http://screencast.com/t/hjBCuRrPC (hagyja figyelmen kívül a fotó. :-P)

Szóval elmentem a lényeg, hogy mit Ortwin csinál, de megváltozott, hogyan csinál egy kis matek összeadni a origin.y & size.height én táblanézetet a magassága a billentyűzetet. Mikor vonjuk ki a magassága az ablak az eredmény, azt mondja nekem, hogy mennyi kereszteződés már folyik. Ha a 0-nál nagyobb (aka van némi átfedés) végrehajtani az az animáció a keret magasságát.

Ezen kívül volt néhány átrajzolja problémát is megoldani 1) Várakozás lépjen a cella, amíg az animáció került sor, és 2) a UIViewAnimationOptionBeginFromCurrentState lehetőség, ha elrejti a billentyűzetet.

Egy pár dolgot meg kell jegyeznünk.

  • _topmostRowBeforeKeyboardWasShown & _originalFrame vannak például a változók nyilvánította a fejlécben.
  • self.guestEntryTableView én Tableview (Én egy külső fájlt)
  • IASKCGRectSwap van Ortwin módszerét essek koordinátáit egy keret
  • Én csak frissíti a magassága a Tableview, ha legalább 50 képpont úgy lesz bemutatva
  • Mivel nem vagyok egy UIViewController nincs self.view, úgyhogy csak vissza a Tableview az eredeti keret

Ismét én nem ütött közel ez a válasz, ha Ortwin nem biztosítja a kritikus pontja is. Itt a kód:

- (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;
}
Válaszolt 18/07/2011 09:45
a forrás felhasználó

szavazat
1

Próbáltam szinte ugyanazt a megközelítést, és jött egy egyszerűbb és kisebb kódot ugyanaz. Hoztam létre IBOutlet iTextView és társított UITextView a IB.

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

    }
Válaszolt 13/05/2011 06:00
a forrás felhasználó

szavazat
1

Ez tökéletesen működik, és az iPad is.

- (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];
        }
Válaszolt 23/10/2010 08:11
a forrás felhasználó

szavazat
0

Most fedeztem fel egy hibát, amikor a UITableViewController. Nem volt görgetés automatikusan billentyűzet felbukkant. Észrevettem, hogy azért, mert a contentInsetAdjustmentBehavior = .never a UITableView.

Válaszolt 03/07/2019 21:30
a forrás felhasználó

szavazat
0

Megoldás Swift 3-4 animációk és billentyűzet keret változó:

Először hozzon létre egy Bool:

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

Másodszor, add megfigyelők a rendszer billentyűzet Közlemények

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

Harmadszor, előkészíti az animációs funkció:

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)
}

Ezután hozzáadjuk a target / akció módszerekkel (hívják a megfigyelők):

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

Végül ne felejtsük el, hogy távolítsa el a megfigyelők deinit vagy viewWillDisappear:

deinit {
    NotificationCenter.default.removeObserver(self)
}
Válaszolt 10/06/2018 15:48
a forrás felhasználó

szavazat
0

Nincs szükség olyan számításokat, használja az alábbi kódot fog működni: Ez a kód azt használják a testreszabott UITableviewcell, ez működik:

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)
}}
Válaszolt 22/02/2018 07:47
a forrás felhasználó

szavazat
0

Swift 4 teljes megoldást:

  • Helyesen működik a billentyűzet keret változások (pl billentyűzet magasságát változik, mint emojii → normál billentyűzet).
  • TabBar & Eszköztár támogatását UITableView például (más példákat kap megfelelő betétlapot).
  • Dinamikus animáció időtartama (nem kódolt).
  • Jegyzőkönyv-orientált, így könnyen használható bármilyen helyzetben.
  • Scroll betétek is működik.

Írtam segítő protokoll (letöltheti azt lényeget , mert túl nagy ahhoz, hogy tegye a StackOverflow), így a néző csak kell:

  1. El kell fogadni a KeyboardChangeFrameObserverprotokoll:

    func willChangeKeyboardFrame(height: CGFloat, animationDuration: TimeInterval, animationOptions: UIViewAnimationOptions)
    
  2. Hívjon observeKeyboardFrameChanges()az jelenik meg.

Példa végrehajtásában, protokoll 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
        })
    }

}
Válaszolt 12/01/2018 00:10
a forrás felhasználó

szavazat
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];
Válaszolt 27/06/2017 21:12
a forrás felhasználó

szavazat
0

Nézd meg a változat :)

    - (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];
}
Válaszolt 02/07/2016 20:32
a forrás felhasználó

szavazat
0

Itt van a megoldás által inspirált „Event szerkesztés” képernyőt iOS7 Naptár alkalmazást.

Az egyik fő pontja ennek a megoldásnak, hogy a billentyűzet elutasítja, ha a felhasználó görgeti asztalra.

Végrehajtás:

1) hozzáadása tulajdonság, amely tárolja a kiválasztott textfield:

@property (strong) UITextField *currentTextField;

és BOOL változó hogy fel fogjuk használni, hogy ellenőrizze, ha el kell rejteni a billentyűzet, ha a felhasználó görgeti asztalra.

BOOL hideKeyboardOnScroll;

2) Fogantyú UITextField küldött visszahívók:

#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) Fogantyú UIScrollViewDelegate módszer annak ellenőrzésére, hogy a felhasználó scroll kilátás.

#pragma mark - UIScrollViewDelegate

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

4) Feliratkozás billentyűzet értesítések viewcontroller a [viewWillAppear] eljárás és leiratkozni a [viewWillDisappear] módszerrel.

- (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) Fogantyú billentyűzet értesítések:

- (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;
}
Válaszolt 21/08/2014 15:43
a forrás felhasználó

szavazat
0

Azt hiszem, a legjobb, ha a UITableViewController.

Ha szeretne egy UITableView egy UIViewController , csak hogy egy contentView egy beágyazott UITableViewController és a következő sorokat a viedDidLoad a UIViewController:

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

Egyszerű,)

Válaszolt 06/06/2014 16:29
a forrás felhasználó

szavazat
0

Azt hiszem, nincs „helyes” módja ennek. Ki kell választani a legjobban illeszkedő megoldás a használati eset. Az én iPad App Van egy UIViewController, hogy a bemutatott modális mint UIModalPresentationFormSheetáll egy UITableView. Ez a tábla tartalmazza két UITextFieldscellánként. Csak hívja scrollToRowAtIndexPath:atScrollPosition:animated:a textFieldDidBeginEditing:módszer nem működik nekem. Ezért hoztam létre egy 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];
}

Az elképzelés az, hogy a billentyűzet eltakarja a tableFooterViewnem az UITextFields. Tehát az tableFooterViewelég nagy legyen ahhoz. Ez után lehet használni scrollToRowAtIndexPath:atScrollPosition:animated:a textFieldDidBeginEditing:módszert.

Azt hiszem, ez is ki lehet mutatni, és elrejteni a tableFooterViewdinamikusan hozzáadásával a megfigyelők a billentyűzet értesítéseket, de én még nem próbáltam még:

- (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];
}
Válaszolt 15/09/2012 08:51
a forrás felhasználó

szavazat
0

Írtam viszont egy kis projekt, hogy megoldja ezt a problémát a billentyűzet, az én esetemben csak be kell tenni az asztalra nézet felmegy, ha a billentyűzet megjelenik.

Remélem ez segít!

http://git.io/BrH9eQ

Válaszolt 19/11/2011 21:21
a forrás felhasználó

szavazat
0

Csak néztem újra a iOS 5.0 lib referencia, és megállapította, ez a rész címe: „Mozgó, hogy a tartalom a billentyűzet alatt található”: TextAndWebiPhoneOS KeyboardManagement

Ez az új iOS 5 óta, talán? Nem olvastam bele még én vagyok a közepén valami mást, de talán mások többet tudnak, és felvilágosít engem és másokat itt.

Vajon az Apple doc helyébe mi tárgyaltuk itt, vagy az információkat itt még hasznos iOS 5 SDK felhasználó?

Válaszolt 26/10/2011 12:07
a forrás felhasználó

szavazat
0

UITableViewControllerműködik a görgetés automatikusan, sőt. A különbség a használatával UIViewControlleraz, hogy létre kell hozni Navbar-Buttonitems programozott úton az NavigationController, ha egy TableViewController.

Válaszolt 20/03/2011 20:59
a forrás felhasználó

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