8
votes

Détecter des clics en dehors de UiscrollView

J'ai mis en place un rouleau de pages selon cette technique ( iOS Développer. Comment prolonger l'événement de réponse de défilement d'Uiscrollview ? ) et cela fonctionne comme prévu comme prévu.

La vue que je fais défile contient quelques boutons et je veux pouvoir cliquer non seulement celles qui sont centrées / pagées dans la vision de Scroll View mais aussi celles à gauche et à la droite de celle-ci. Je ne trouve aucun moyen de résoudre ce problème mais je ne suis pas vraiment un iOS-Jedi, en espérant que l'un d'entre vous est cependant :)

mon xib, avec l'Uiscrollview au centre

Ainsi que vous pouvez le voir à partir de la scénario, l'UISCrollView est d'environ un tiers de la largeur de la fenêtre, le contenu de l'UISCrollView est beaucoup plus grand: environ 1500px et contient de nombreux boutons ajoutés par programme. La chose cool avec cette solution et la partie qui fonctionne réellement, est que les boutons: 1) sont paginés dans la vision de défilement 2) sont visibles en dehors de la vision de ScrollView (puisque "Sous-Views de clip" est décochée pour le ScrollView) 3) Les boutons sont cliqués lorsqu'ils sont visibles à l'intérieur de l'UISCrollView.

Mais qu'est-ce qui ne fonctionne pas, c'est simplement ceci: - Les boutons étant en dehors de la fenêtre ne reçoivent pas de clics "leurs" en cliquant dessus, les événements sont à la place transmis au sous-réseau (la partie blanche de la fenêtre).


5 commentaires

Juste pour vous assurer de bien comprendre votre question correctement, vous dites que vous voulez pouvoir obtenir des clics de l'extérieur des limites et du cadre de la vue de défilement?


Michael: Oui, je crois que c'est ce que je veux. L'objectif est de rendre les composants dans la vue de défilement - mais pas dans sa zone de pagie - cliquable. Je suis désolé de ne pas être particulièrement bon pour m'expliquer.


Il pourrait être utile d'inclure une capture d'écran. Si vous avez des boutons situés en dehors de votre vishat de ScrollView mais que vous pouvez fixer une partie du même fichier XIB, vous pouvez affecter des actions à tirer en cliquant sur ces boutons.


Michael: Les boutons sont ajoutés programmatiquement à l'UiscrollView et non dans une nibrité et même dans l'affirmative, le problème est que l'événement n'atteint jamais les boutons affichant en dehors de l'UiscrollView.


Merci d'inclure cette capture d'écran! Ahhh, vous voulez donc dire que les boutons sont ajoutés au contenu de l'UISCrollView, mais en dehors du rectangle visible de l'UISCrollView's Visible (et des limites)?


3 Réponses :


16
votes

Donc,

I enfin réussi à résoudre ce casse-tête forte> et la solution est divisée en deux les pièces. Le problème était que vous rappelez-vous que les événements de clic ne voyagaient pas à la boutons qui étaient (visibles) en dehors de l'Uiscrollview. Il s'est avéré que les clics ont été capturés par la vue sous-jacente et qu'il est possible de manipuler leur moyen de trouver leur objectif en pliant un peu les règles de qui a été touchée et de trembler ainsi les événements à passer de l'endroit où vous les voulez. Pas vraiment sûr s'il s'agit de la façon dont il devrait être fait em>, mais cela a résolu mon problème ... :) p>

1) Tout d'abord, il faut remplacer la méthode suivante dans la vue de dessous de sorte qu'il renvoie la vision de défilement au lieu de lui-même le cas échéant. p> xxx pré>

2) La vision de défilement doit remplacer deux méthodes pour remettre les clics sur ses objets contenus. P> XXX PRE>

et P>

- (BOOL)pointInside:(CGPoint)point withEvent:(UIEvent *)event
{
    // We want EVERYTHING!
    return YES;
}


1 commentaires

Merci beaucoup! Mais il y a un petit problème ... Toutes les sous-états SUPERVIEW SORS SUPERVIEW ont une couleur plus claire. Un peu plus léger ... est-il possible de le réparer facilement?



0
votes

Voici ma version:

  1. Appuyez sur le test dans le conteneur p>

    - (BOOL) pointInside:(CGPoint)point withEvent:(UIEvent *)event
    {
        return YES;
    }
    


0 commentaires

2
votes

Inspiré de la réponse @Tommys mentionnée, il s'avère que, en remplaçant la méthode la plus utile d'un UIView et de renvoyer la vision de ScrollView à la place, vous pouvez réellement détacher la balayage de cet uIView à la ScrollView.

- (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event 
{
    UIView *view = [super hitTest:point withEvent:event];

    // Doing this make you detached the swiping to the scrollView
    if (view == self) 
        return [self scrollView];

    return view;
}


0 commentaires