102 votes

l'interaction au-delà des limites de uiview

Est-il possible pour un UIButton (ou n'importe quel autre contrôle que ce soit), pour recevoir les événements tactiles lorsque le UIButton du cadre se trouve à l'extérieur de celle du parent de l'image? Parce que quand j'essaie de cela, ma UIButton ne semble pas être en mesure de recevoir tous les événements. Comment puis-je contourner cela?

97voto

jnic Points 3149

Oui. Vous pouvez remplacer l' hitTest:withEvent: méthode de retour d'une vue pour un plus grand ensemble de points de vue que contient. Voir la Classe UIView de Référence.

Edit: Exemple:

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event
{
    CGFloat radius = 100.0;
    CGRect frame = CGRectMake(-radius, -radius,
                              self.frame.size.width + radius,
                              self.frame.size.height + radius);

    if (CGRectContainsPoint(frame, point)) {
        return self;
    }
    return nil;
}

Edit 2: (Après clarification:) afin de s'assurer que le bouton est considérée comme étant à l'intérieur de la mère de limites, vous avez besoin de redéfinir pointInside:withEvent: dans le parent d'inclure le bouton de l'image.

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    if (CGRectContainsPoint(self.view.bounds, point) ||
        CGRectContainsPoint(button.view.frame, point))
    {
        return YES;
    }
    return NO;
}

Remarque le code juste là pour remplacer pointInside n'est pas tout à fait correct. Comme Invoquer explique ci-dessous, faites ceci:

-(BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
    if ( CGRectContainsPoint(self.oversizeButton.frame, point) )
        return YES;

    return [super pointInside:point withEvent:event];
    }

Notez que vous auriez très probablement le faire avec self.oversizeButton comme un IBOutlet dans la présente sous-classe UIView; ensuite, vous pouvez simplement faire glisser les "oversize bouton" en question, à la vue en question. (Ou, si pour quelque raison que vous faisiez beaucoup dans un projet, vous auriez un spécial UIButton sous-classe, et vous pouvez regarder à travers votre sous-vue de liste pour ces classes.) Espérons que cela aide.

24voto

Summon Points 366

@jnic, je suis en train de travailler sur SDK iOS 5.0 et afin d'obtenir votre code de travail de droit que j'avais à faire ceci:

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event {
if (CGRectContainsPoint(button.frame, point)) {
    return YES;
}
return [super pointInside:point withEvent:event]; }

Le conteneur de vue dans mon cas, c'est un UIButton et tous les éléments enfants sont également UIButtons qui peuvent se déplacer à l'extérieur des limites de la mère UIButton.

Meilleur

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