68 votes

UIButton ne montrant pas de mettre en évidence sur le robinet dans iOS7

J'ai regardé une tonne de posts sur des choses similaires, mais aucun d'entre eux tout à fait correspondre ou résoudre ce problème. Depuis iOS 7, chaque fois que j'ajoute un UIButton à un UITableViewCell ou même à la footerview il fonctionne "fine", ce qui signifie qu'il reçoit de l'action cible, mais il ne veut pas montrer le peu de mettre en évidence que, normalement, il arrive que vous appuyez sur une UIButton. Il permet de l'INTERFACE utilisateur look funky ne pas montrer le bouton de réagir au toucher.

Je suis sûr que cela compte comme un bug dans iOS7, mais quelqu'un a trouvé une solution ou pourrait m'aider à en trouver un :)

Edit: J'ai oublié de mentionner qu'il va mettre en évidence si j'ai longtemps sur le bouton, mais pas un mouvement rapide, comme c'est si juste ajouté un affichage standard.

Code:

Création du bouton:

UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    button.titleLabel.font = [UIFont systemFontOfSize:14];
    button.titleLabel.textColor = [UIColor blueColor];
    [button setTitle:@"Testing" forState:UIControlStateNormal];
    [button addTarget:self action:@selector(buttonPressed:) forControlEvents: UIControlEventTouchDown];
    button.frame = CGRectMake(0, 0, self.view.frame.size.width/2, 40);

Les choses que j'ai Testé:

//Suppression de modules de reconnaissance de geste sur UITableView dans le cas où ils étaient.

for (UIGestureRecognizer *recognizer in self.tableView.gestureRecognizers) {
   recognizer.enabled = NO;
}

//Suppression des gestes de la Cellule

for (UIGestureRecognizer *recognizer in self.contentView.gestureRecognizers) {
       recognizer.enabled = NO;
    }

//Cela montre le peu de lumière tactile, mais ce n'est pas le look désiré

button.showsTouchWhenHighlighted = YES;

87voto

subramani Points 592

Dans ce tableview vous suffit d'ajouter cette propriété.

tableview.delaysContentTouches = NO;

Et d'ajouter dans cellForRowAtIndexPath après que vous lancez la cellule vous venez d'ajouter le code ci-dessous. La structure de la cellule est apparemment différent dans iOS 6 et iOS 7.
iOS 7, nous avons un contrôle UITableViewCellScrollView entre UITableViewCell et l'Affichage du contenu.

for (id obj in cell.subviews)
{
    if ([NSStringFromClass([obj class]) isEqualToString:@"UITableViewCellScrollView"])
    {
        UIScrollView *scroll = (UIScrollView *) obj;
        scroll.delaysContentTouches = NO;
        break;
    }
}

40voto

Roman B. Points 458

Depuis iOS 8, nous devons appliquer la même technique à UITableView des sous-vues (tableau contient un caché UITableViewWrapperView défilement de l'affichage). Il n'est pas nécessaire itérer UITableViewCell des sous-vues plus.

for (UIView *currentView in tableView.subviews) {
    if ([currentView isKindOfClass:[UIScrollView class]]) {
        ((UIScrollView *)currentView).delaysContentTouches = NO;
        break;
    }
}

Cette réponse doit être en relation avec cette question.

27voto

Eric Points 2533

J'ai essayé de l'ajouter à la accepté de répondre, mais il n'est jamais allé à travers. C'est une façon beaucoup plus sécuritaire d'éteindre les cellules delaysContentTouches bien car il n'a pas l'air pour une classe spécifique, mais plutôt quelque chose qui répond à la sélection.

Dans La Cellule:

for (id obj in self.subviews) {
     if ([obj respondsToSelector:@selector(setDelaysContentTouches:)]) {
          [obj setDelaysContentTouches:NO];
     }
}

Dans TableView:

self.tableView.delaysContentTouches = NO;

18voto

Quentin Points 2309

Pour une solution qui fonctionne dans les deux iOS7 et iOS8, créer un UITableView sous-classe et personnalisé UITableViewCell sous-classe.

Ajoutez ce code à votre custom UITableView de initWithFrame:

// iterate over all the UITableView's subviews
for (id view in self.subviews)
{
    // looking for a UITableViewWrapperView
    if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewWrapperView"])
    {
        // this test is necessary for safety and because a "UITableViewWrapperView" is NOT a UIScrollView in iOS7
        if([view isKindOfClass:[UIScrollView class]])
        {
            // turn OFF delaysContentTouches in the hidden subview
            UIScrollView *scroll = (UIScrollView *) view;
            scroll.delaysContentTouches = NO;
        }
        break;
    }
}

Ajoutez ce code à votre custom UITableViewCell de initWithFrame:

// iterate over all the UITableViewCell's subviews
for (id view in self.subviews)
{
    // looking for a UITableViewCellScrollView
    if ([NSStringFromClass([view class]) isEqualToString:@"UITableViewCellScrollView"])
    {
        // this test is here for safety only, also there is no UITableViewCellScrollView in iOS8
        if([view isKindOfClass:[UIScrollView class]])
        {
            // turn OFF delaysContentTouches in the hidden subview
            UIScrollView *scroll = (UIScrollView *) view;
            scroll.delaysContentTouches = NO;
        }
        break;
    }
}

16voto

Raphaël Pinto Points 98

Ce que j'ai fait pour résoudre le problème d'une catégorie de UIButton en utilisant le code suivant :

- (void) touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesBegan:touches withEvent:event];


    [NSOperationQueue.mainQueue addOperationWithBlock:^{ self.highlighted = YES; }];
}


- (void) touchesCancelled:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesCancelled:touches withEvent:event];

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

- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event
{
    [super touchesEnded:touches withEvent:event];

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


- (void)setDefault
{
    [NSOperationQueue.mainQueue addOperationWithBlock:^{ self.highlighted = NO; }];
}

le bouton réagit correctement lorsque j'appuie sur le dans un UITableViewCell, et mon UITableView se comporte normalement, comme l' delaysContentTouches n'est pas forcé.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X