Désactivation du défilement automatique de UITableView lors de l'édition D'UITextField dans Uitable Viewcell

j'utilise custom UITableViewCells à l'intérieur de mon UITableView. Chacun de ces UITableViewCells est assez élevé et contient un UITextField en haut.

quand un utilisateur tape le UITextField pour l'éditer, un clavier apparaît et le UITableView défile automatiquement, de sorte que la cellule est en haut de l'écran.

le problème est que cela efface le UITableView au fond de la UITableViewCell, pas le haut. Lorsque l' UITableViewCell est élevé et édité le UITextField est au sommet de sorte que vous ne pouvez pas voir UITextField. Je sais comment faire défiler le UITableView de la programmation, mais je ne sais pas comment désactiver le défilement automatique afin que je puisse faire défiler l' UITableView sur mon propre. Comment puis-je faire cela?

44
demandé sur Bono 2012-03-09 19:58:27

8 réponses

le comportement de l'autoscroll est situé dans le UITableViewController fonctionnalité.

Pour désactiver le défilement automatique, j'ai trouvé deux façons:

  1. utilisez au lieu du UITableViewController simplement UIViewController - définir la source de données et délégué sur votre propre.
  2. Remplacer viewWillAppear méthode et ne pas appeler [super viewWillAppear: animated]

avec les deux solutions, vous désactivez non seulement L'Autoscroll, mais aussi d'autres fonctionnalités intéressantes mais non essentielles, qui sont décrites dans le aperçu de la classe de pommes référence:

https://developer.apple.com/documentation/uikit/uitableviewcontroller

62
répondu Dominic Sander 2017-06-29 14:23:56

définissez les propriétés pour votre UITableViewController:

@property (nonatomic) BOOL scrollDisabled;
@property (nonatomic) CGFloat lastContentOffsetY;

avant d'appeler becomeFirstResponder:

// Save the table view's y content offset 
lastContentOffsetY = tableViewController.tableView.contentOffset.y;
// Enable scrollDisabled
scrollDisabled = YES;

ajouter le code suivant à votre controller de vue de table:

-(void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (self.scrollDisabled) {
        [self.tableView setContentOffset:CGPointMake(0, lastContentOffsetY)];
    }
    ...
}

une fois que vous appelez resignFirstResponder, définissez scrollDisabled = NO.

6
répondu william-yang 2016-11-01 19:06:34

Vous pouvez effectuer les opérations suivantes:

- (void)registerForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(keyboardWillShow:)
                                                 name:UIKeyboardWillShowNotification object:nil];

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

- (void)unregisterForKeyboardNotifications
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardWillShowNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:UIKeyboardDidShowNotification object:nil];
}

- (void)keyboardWillShow:(NSNotification *)notification
{
    self.tableView.scrollEnabled = NO;
}

- (void)keyboardDidShow:(NSNotification *)notification
{
    double delayInSeconds = 0.3;
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){
            self.tableView.scrollEnabled = YES;
    });
}

alors implémentez cette méthode UIScrollViewDelegate

- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
    if (! self.tableView.scrollEnabled)
        [self.tableView scrollToRowAtIndexPath:[NSIndexPath indexPathForItem:0 inSection:0] atScrollPosition:UITableViewScrollPositionTop animated:NO];
}

!!! Mais attention, si l'utilisateur tape dans un emplacement dans le champ Uitext qui sera couvert par le clavier, alors il ne fera pas défiler.

de mon point de vue, la meilleure chose à faire est de s'assurer que toutes les cellules de haut en bas avec L'UITextField inclus, seront visibles quand le clavier apparaîtra.

3
répondu arturgrigor 2013-04-12 13:52:07

pour moi, le problème n'était pas tellement qu'il se déroulait, mais qu'il prenait la vue texte étant supprimée de l'écran.

donc au lieu d'empêcher le défilement, je réécris juste la vue de table à l'endroit où je veux quand l'édition est déclenchée, comme ceci:

public func textViewShouldBeginEditing(textView: UITextView) -> Bool {            
  dispatch_async(dispatch_get_main_queue()) {
    tableViewController.tableView.scrollToRowAtIndexPath(self.indexPath!, atScrollPosition: UITableViewScrollPosition.Middle, animated: true)
  }
  return true
}
1
répondu infinite-loop 2015-02-27 22:33:24

malheureusement, la vue d'ensemble s'affichera: ne fonctionne pas pour moi dans iOS 8.

voici ma solution (comme dans l'implémentation du Controller Uitable ViewController):

- (void)viewDidLoad {

[super viewDidLoad];

[[NSNotificationCenter defaultCenter] removeObserver:self.tableView name:UIKeyboardWillShowNotification object:nil];

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

puisque le comportement d'auto-défilement est invoqué par les notifications show/hide D'UIKeyboard, donc ne pas les observer.

1
répondu keyOfVv 2015-04-03 08:10:53

le mieux est de La sous-classe UITableView puis remplacer setContentOffset(_ contentOffset: CGPoint, animated: Bool) et de ne pas appeler super.setContentOffset(_ contentOffset: CGPoint, animated: Bool). Dans cette méthode est où le contrôleur de vue fait le déroulement automatique.

override func setContentOffset(_ contentOffset: CGPoint, animated: Bool)
{
    //Do nothing
}
1
répondu juanelomx 2016-12-15 17:50:21

avez - vous essayé de mettre "scrollsToTop" - propriété de tableview à NO. Par défaut, c'est OUI.

-2
répondu cocoakomali 2012-03-10 16:20:20

Vous pouvez essayer de faire ce qui suit:

self.tableView.scrollEnabled = NO;

ceci devrait désactiver le scrollview dans le tableview.

-5
répondu DHShah01 2012-12-24 01:52:56