UIControl Ne Reçoit Pas De Touche
J'ai un UIControl qui met en œuvre la touche a commencé méthode comme suit:
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
[super touchesBegan:touches withEvent:event];
//More code goes here
La présente sous-classe de UIControl est instancié dans une vue-contrôleur, il est ajouté une sous-vue de ce point de vue-contrôleur. J'ai un point d'arrêt sur la touche a commencé méthode de la UIControl, et la méthode n'est jamais appelé. J'ai fait un peu de lecture, et il semble que le point de Vue du Contrôleur a une certaine logique qui décide de passer sur les événements tactiles à ses sous-vues. La chose étrange est que j'ai un autre sous-classe de UIControl dans la même vue contrôleur, et les événements tactiles sont transmises lorsque l'utilisateur touche!
Voici le code complet:
.h
#import <UIKit/UIKit.h>
@interface CustomSegment : UIView
@property (nonatomic, strong) UIImageView *bgImageView;
@property (nonatomic, assign) NSInteger segments;
@property (nonatomic, strong) NSArray *touchDownImages;
@property (nonatomic, readonly, assign) NSInteger selectedIndex;
@property (nonatomic, weak) id delegate;
- (id)initWithPoint:(CGPoint)point numberOfSegments:(NSInteger)_segments andTouchDownImages:(NSArray *)_touchDownImages;
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event;
@end
.m
#import "CustomSegment.h"
@implementation CustomSegment
@synthesize bgImageView, segments, touchDownImages, selectedIndex, delegate;
- (id)initWithPoint:(CGPoint)point
numberOfSegments:(NSInteger)_segments
andTouchDownImages:(NSArray *)_touchDownImages
{
self = [super initWithFrame:CGRectMake(point.x, point.y, [[_touchDownImages objectAtIndex:0] size].width, [[touchDownImages objectAtIndex:0] size].height)];
if (self)
{
touchDownImages = _touchDownImages;
segments = _segments;
bgImageView = [[UIImageView alloc] initWithImage:[touchDownImages objectAtIndex:0]];
[self addSubview:bgImageView];
}
return self;
}
- (BOOL)beginTrackingWithTouch:(UITouch *)touch withEvent:(UIEvent *)event
{
return YES;
}
- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
{
//[super touchesBegan:touches withEvent:event];
UITouch *touch = [touches anyObject];
float widthOfSegment = [self frame].size.width / segments;
float bottomPoint = 0;
float topPoint = widthOfSegment;
for (int i = 0; i < segments; i++)
{
if ([touch locationInView:self].x > bottomPoint && [touch locationInView:self].x < topPoint)
{
[bgImageView setImage:[touchDownImages objectAtIndex:i]];
selectedIndex = i;
return;
}
else
{
bottomPoint = topPoint;
topPoint += topPoint;
}
}
}
@end
- Comment faire, vous ajoutez les deux UIControll sunbviews? Pouvez-vous montrer un peu de code?
- La Solution est dans un autre thread ici, par "jhabbot' stackoverflow.com/questions/1245248/...
Vous devez vous connecter pour publier un commentaire.
tl;dr Ensemble de tous les sous-vues de la UIControl à
setUserInteractionEnabled:NO
. UIImageView est par défaut l'ai mis à vrai.Post Original
Une chose que j'ai découvert récemment, c'est que si le haut de la sous-vue de la UIControl a
setUserInteractionEnabled:NO
. Je suis arrivé à cela parce que j'avais un UIControl sous-classe avec une UIImageView que c'est seulement sous-vue et il a bien fonctionné. UIImageView auserInteractionEnabled
ensemble deNO
par défaut.J'ai aussi eu un autre UIControl avec une UIView que c'est top la plupart des sous-vue (techniquement le même UIControl dans un état différent de l'état). Je crois UIView par défaut
userInteractionEnabled == YES
, ce qui exclut les événements traités par le UIControl. Les paramètres de la UIView deuserInteractionEnabled
àNO
résolu mon problème.Je ne sais pas si c'est le même problème ici, mais peut-être que vous aider?
--
Edit: Quand je dis plus haut point de vue... probablement l'ensemble de tous les sous-vues de la UIControl à
setUserInteractionEnabled:NO
Vérifier
frame
s de tous les parents de vues. La règle est que si la sous-vue (ou une partie) de la vue est en dehors de la vue de limites, il ne reçoit pas les événements tactiles.Il est possible qu'un autre point de vue est de couvrir votre UIControl, et l'empêche de recevoir les événements tactiles. Une autre possibilité est que
userInteractionEnabled
est fixé àNO
quelque part par erreur.EDIT: je vois que vous avez ajouté plus de code ci-dessus. Avez-vous vérifier que votre point de vue de l'image a une largeur et une hauteur supérieure à zéro? Il me semble que vous appelez "taille" directement sur un objet à partir de NSArray (qui est 'id'). Je ne sais pas comment vous faites cela sans un cast (peut-être la parenthèse n'est pas venu par dessus?) mais si vous êtes en quelque sorte en le tirant hors je ne serais pas surpris si c'était une valeur non valide.
Possibilités:
Assez juste. Récemment ré-étudié cette (UIControl est très mal documenté) et réalisé que le suivi de touche est un remplacement pour touchesBegan/Terminé, pas un supplémentaires, désolé. J'avais inverser le vote, mais il ne me laisserait pas 🙁
Tout d'abord, pourquoi l'appelez-vous
[super touchesBegan:touches withEvent:event];
? Cet appel est de transmettre l'événement pour le prochain intervenant. Habituellement, vous le faire seulement quand vous ne voulez pas gérer l'événement. Êtes-vous sûr que vous savez ce que vous faites là?Une idée de pourquoi ça ne fonctionne pas - se peut-il que vous disposez d'un geste de reconnaissance qui gère l'événement en premier?
De toute façon, avez-vous vraiment besoin de remplacer
touchesBegan
?UIControl
est fait pour suivre les événements tactiles par lui-même et appelez votre contact en réponse. Et leUIControl
docs disent COMMENT la sous-classe il.UIScrollView
, ce qui annule la touche de son contenu? Il y a donc beaucoup de possibilités.touchesBegan
, en général, vous n'appelez passuper
. C'est pourquoiUIControl
n'est pas souvent surchargée de cette façon. Si vous lisez en réponse, vous allez comprendre.UIView instances sont pas en mesure de répondre à des événements, donc il n'y a aucun moyen, jusqu'à votre configuration actuelle, pour déclencher votre méthode d'action ?
Essayer de changer la classe de la vue à une instance de la UIControl classe !