UIButton ne fonctionne pas correctement dans iOS 7

J'ai un problème avec un UIButton qui fonctionne parfaitement bien dans iOS6, mais ne répond pas aux events tactiles dans iOS7 jusqu'à un certain point. Pour clarifier s'il vous plaît voir ci-dessous l'image:

ios7_button_issue

Le button qui échoue est le button "Discard All" qui se trouve dans le UIView. (S'il vous plaît noter, ce button est seulement désactivé temporairement et ce n'est pas le problème.Je n'ai tout simplement pas une capture d'écran du test le plus récent où le button est activé ")

Ce button ignore toutes les touches, sauf si vous appuyez d'abord sur les buttons "Discard" ou "Retry" dans UITableViewCell. (Cela provoque un rechargement du controller de vue, ce qui triggers l'appel des methods de cycle de vie comme ViewDidLoad.) Après avoir appuyé sur les buttons "Discard" ou "Retry" dans la cellule de vue de table, le button "Discard All" commence à fonctionner correctement.

La vue et le button "Discard All" sont construits sur le file XIB du controller et non sur le code. Cela échoue uniquement sur iOS7 et commence à fonctionner dès que les buttons de la cellule taleview sont touchés.

Quelqu'un a des idées?

Merci!

J'ai trouvé la solution hier soir. Bon, alors ce qui se passe, c'est que je mets la vue de table ci-dessus et les éléments UIView sur un cadre cible.

Je ne suis pas sûr à 100%, mais il semble que dans iOS6 les buttons répondent aux events indépendamment de l'endroit où ils sont placés. Pour une raison quelconque, dans iOS7, lorsque le button se trouve à l'extérieur du cadre dans lequel il est supposé être, il ignore les events tactiles, même s'il est affiché.

J'ai résolu le problème en positionnant le cadre de la vue au bon endroit afin qu'il recouvre le button.

Si je peux find de la documentation à ce sujet, je postrai ici.

Merci!

Je viens de faire face à ce problème. Selon le conseil de @Guntis Treulands , j'ai décidé de vérifier ce qui se passe si je substitue la hitTest:withEvent: dans ma vue d'en-tête personnalisée. Cette méthode ignore les objects de vue qui sont masqués, qui ont désactivé les interactions user ou dont le niveau alpha est inférieur à 0,01. Cette méthode ne prend pas en count le contenu de la vue lors de la détermination d'un hit. Ainsi, une vue peut toujours être renvoyée même si le point spécifié se trouve dans une partie transparente du contenu de cette vue et, après avoir été remplacé, reçoit des contacts en dehors des limites. Ça a fait l'affaire pour moi. J'espère que cela vous aide, les gars.

 - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event { if (!self.clipsToBounds && !self.hidden && self.alpha > 0) { for (UIView *subview in self.subviews.reverseObjectEnumerator) { CGPoint subPoint = [subview convertPoint:point fromView:self]; UIView *result = [subview hitTest:subPoint withEvent:event]; if (result != nil) { return result; } } } // use this to pass the 'touch' onward in case no subviews sortinggger the touch return [super hitTest:point withEvent:event]; } 

Juste comme une réponse alternative – En fait pour moi, cela n'a jamais fonctionné (si uibutton est en dehors de sa vue parent, alors il ne recevra pas de contact.) – Mais dans certains cas, il est nécessaire d'avoir le button en dehors de ses limites.

Pour cette raison, il existe une fonction la plus intéressante, qui peut être surchargée – pour vérifier simplement la vue parent toutes les sous-vues pour find uibutton qui est placé en dehors des limites des vues parent. (Vous devriez alors vérifier chaque sous-vue, si c'est un type d'uibutton, et si les coordonnées touchées sont dans le cadre d'uibuttons.

Par défaut, la fonction hittest ignore les vues de contrôle, qui sont en dehors des limites.

Exemple de Hittest: https://stackoverflow.com/questions/17246488/best-way-to-perform-the-hit-test-objective-c .

Je ne sais pas si c'est le même cas, mais cela pourrait être lié:

Lorsque UIButton est dans une vue avec un UIGestureRecognizer qui n'a pas défini delaysTouchesEnded sur NO (la valeur par défaut est YES), le button ne recevra plus les events TouchUpInside dans iOS 7. Il a reçu les events TouchUpInside dans iOS 6.

Si possible, définissez la propriété delaysTouchesEnded de UIGestureRecognizer sur NO pour résoudre le problème.

C'est bizarre mais je développais une nouvelle application pour iOS 7 et définissais [cell.contentView setUserInteractionEnabled: YES]; effectivement travaillé pour moi.

J'ai eu ce même problème – les buttons fonctionnaient sur iOS6 et pas sur iOS7, le problème était avec Container UIView auquel UIView UIButtons , UIView contraintes au conteneur UIView et ça commençait à fonctionner. Code que j'ai dû append dans mon cas:

 [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V: [_controllersView]-|" options:0 mesortingcs:nil views:views]]; [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:[_controllersView(70)]" options:0 mesortingcs:nil views:views]]; [superView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[_controllersView]|" options:0 mesortingcs:nil views:views]]; 

Si elle utilise la layout automatique, essayez d'append une instruction de journal dans -viewDidAppear:

 NSLog(@"Height of UIView: %f", self.<name of UIView>.frame.size.height); 

Si le résultat est 0 (ou pas assez grand), définissez la hauteur de UIView sur la hauteur du button "Discard All".

Vérifiez que le button dans le cadre parent à l'intérieur

J'ai également eu le même problème mais après avoir ajouté ci-dessous des actions de button de code fonctionnant correctement cell.contentView.userInteractionEnabled = NO;

Bon, il semble que les buttons créés par programmation dans iOS7 n'appellent pas leur cible. Je ne sais pas pourquoi, mais j'ai trouvé la solution suivante:

  1. Dans InterFace Builder (ou nib), ajoutez un button et personnalisez-le. ( theButtonInTheNib );

  2. Rend la propriété IBOutlet: @property (strong) IBOutlet UIButton *theButtonInTheNib

  3. Effectuez la connection IBAction cible: (IBAction)theTargetAction:(id)sender;

Voici le tour. Nous ferons une copy / ou des copys de ce button:

 NSData *archivedData = [NSKeyedArchiver archivedDataWithRootObject:theButtonInTheNib]; UIButton *theCopyButton = [NSKeyedUnarchiver unarchiveObjectWithData:archivedData]; [theCopyButton setHidden:NO]; [theCopyButton setFrame:CGRectMake(x, y, width, height)]; [theCopyButton addTarget:self action:@selector(theTargetAction:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview:theCopyButton]; 

J'ai ajouté à nouveau l'action cible, mais toute autre action fonctionnera.