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?
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
UITableViewControllersimplementUIViewController- définir la source de données et délégué sur votre propre. - Remplacer
viewWillAppearmé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.