Désactivation du défilement automatique de UITableView lors de l'édition D'UITextField dans Uitable Viewcell
j'utilise custom UITableViewCell
s à l'intérieur de mon UITableView
. Chacun de ces UITableViewCell
s 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?
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:
- utilisez au lieu du
UITableViewController
simplementUIViewController
- définir la source de données et délégué sur votre propre. - 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
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
.
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.
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
}
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.
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
}
avez - vous essayé de mettre "scrollsToTop" - propriété de tableview à NO. Par défaut, c'est OUI.
Vous pouvez essayer de faire ce qui suit:
self.tableView.scrollEnabled = NO;
ceci devrait désactiver le scrollview dans le tableview.