web-dev-qa-db-fra.com

UIButton ne fonctionne pas lorsqu'il est dans UIScrollView

Ma structure de vues:

UITableView
  UITableViewCell
    UIScrollView
      CustomView
        UIButton

Le problème est que UIButton ne fonctionne pas quand je le touche . Je le crée avec le code:

btn = [[UIButton alloc] init];
[btn setImage:image forState:UIControlStateNormal];
[btn addTarget:self action:@selector(tileTouchUpInside) forControlEvents:UIControlEventTouchUpInside];
btn.layer.zPosition = 1;
[self addSubview:btn];

J'ai aussi ajouté ceci:

scroll.delaysContentTouches = NO;
scroll.canCancelContentTouches = NO;

Mais mon bouton ne fonctionne pas quand même. Je ne peux pas annuler ni contourner ni définir de délai pour UITableView, car si je le définis, UITableView arrêtera de faire défiler verticalement.

Merci pour toute aide! 

19
George

Créez une sous-classe de UIScrollview avec

- (BOOL)touchesShouldCancelInContentView:(UIView *)view {
  return NO;
}

Si vous ne recevez pas ce message, définissez:

scrollView.delaysContentTouches = NO;

Le problème tient à la façon dont touchesShouldCancelInContentView se comporte par défaut: il renvoie NO uniquement si la sous-vue est un UIControl, mais votre bouton est masqué dans le CustomView, ce qui n'est pas le cas.

19
Capt. Hook

Entré dans le même scénario. UIScrollView en classe séparée et en ajoutant un bouton via une vue personnalisée. 'NSNotificationCenter' m'a aidé à résoudre le problème . Exemple de code:

-(void)tileTouchUpInside:(id)sender
{    
    NSDictionary *dict=[NSDictionary dictionaryWithObject:@"index" forKey:@"index"];

    [[NSNotificationCenter defaultCenter]postNotificationName:@"Action" object:nil userInfo:dict];
}

Dans la classe contenant la vue de défilement:

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(doAction:) name:@"Action" object:nil];
}
-(void)doAction:(NSNotification *) notification
{
    NSString* value =[notification.userInfo valueForKey:@"index"];
    // .......
}

Activer userInteraction pour la vue de défilement, la vue personnalisée et le bouton.

4
Siva

Je suppose que vous devez définir le cadre du bouton. Par défaut, si vous utilisez la méthode btn = [[UIButton alloc] init]; pour initialiser le bouton, il s'agira de UIButtonTypeCustom. Définissez également une couleur d’arrière-plan pour le débogage afin de noter où le bouton est réellement placé . Maintenant, pour votre cas, vous devez définir le cadre pour ce bouton comme btn.frame = CGRectMake(0,0,100,100);

Pour UIScrollView interne, implémentez cette méthode de délégation.

- (BOOL)touchesShouldCancelInContentView:(UIView *)view
  {
       return ![view isKindOfClass:[UIButton class]];
  }

Cela peut fonctionner.

3
IronMan

Le cadre de votre CustomView pourrait interférer avec votre UIButton. Se chevauchent-ils? Ajoutez votre bouton au CustomView juste pour tester par [CustomView addSubview:UIButton]; (en utilisant vos valeurs bien sûr). Si cela fonctionne, votre problème est probablement un chevauchement.

2
sangony

Aucune des réponses n'a fonctionné pour moi, parce que mon problème était que le bouton n'était pas visible au moment de la mise en page ou quelque chose du genre ...

RÉPARER:

1) déplacez complètement le bouton de la scrollView (pour être une sous-vue de la view principale de VC).

 main view's hierarchy

2) sélectionnez la button et l’élément de votre contentV vous voulez que votre bouton soit localisé (dans mon cas: après le dernier élément de conventV)

 button and last element selection

3) ajouter les contraintes nécessaires (dans mon cas: être aligné en bas)

 enter image description here

4) Ajoutez le reste des contraintes pour la button.

5) Profitez.

1
Nikola Markovic

Ajoutez toutes les sous-vues de CustomView à ScrollView. Et cachez le CustomView. Assurez-vous que CustomView (ContainerView de scrollView) doit également être une sous-vue de scrollView.

0
Jeet

Link de Capt.Hook m'a aidé. J'ai utilisé UIGestureRecognizer au lieu de UIButtons.

Autorise UIScrollView et ses sous-vues à répondre à un contact .__ Utilisez-le si vous rencontrez le même problème.

0
George