Question

J'ai été cognait ma tête sur celui-ci pendant un certain temps et je compris. Je veux redonner à la communauté depuis que je l'ai reçu beaucoup d'aide de ce site:.)

Je suis en train de copier un élément d'un UITableView à un autre UITableView et des informations que je l'ai vu sur le web en ce qui concerne la façon de procéder a été peu précis au mieux. Je me suis hors de moi-même et je vais vous décrire ma petite architecture.

  • Master UIView
    • UIView avec UITableView
      • Personnaliser UITableViewCell
        • personnalisé UIView qui va être copiée (objet Personne dans mon cas)
    • UIView avec UITableView
      • Personnaliser UITableViewCell
        • personnalisé UIView qui va être copiée (objet Personne dans mon cas)

L'objet personne que j'ai dans le UITableView est l'objet que je veux faire glisser et déposer sur une table et dans un autre. J'ai eu le plus difficile à comprendre comment faire apparaître l'élément de la table et faites-le glisser sur un seul mouvement lisse. Pendant très longtemps, il me faudrait deux touches pour effectuer l'opération.

A partir de l'objet Personne, ceci est un objet simple qui contient une image. Je devais mettre en œuvre ma propre méthode touchesMoved pour changer la position centrale de la personne lorsqu'un glissement a lieu.

-(void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event{
    if( m_moveable == YES ){
        UITouch *touch = [touches anyObject];
        CGPoint location = [touch locationInView:self.superview];

        if( 0 < location.x-50 && location.x+50 < 768 ){ 
            if( 0 < location.y-50 && location.y+150 < 1004 ){
                self.center = location;
            }
        }
    }
}

Je mis le drapeau userInteractionEnabled de l'objet Personne à l'initialisation NO afin que tous les clics dans le tableau ne serait pas se laisser prendre par l'objet personne. L'objet Personne dans ce cas, se déplacerait dans la table qui contrecarre le but.

L'objet suivant est mon habitude UITableViewCell. Cet objet est responsable d'attraper premier contact de l'utilisateur. Qu'est-ce qu'il est censé faire est attraper cette touche et « pop » la personne sur. La personne est l'un des sous-vues appartenant à la UITableViewCell personnalisée.

 - (void) touchesMoved:(NSSet *)touches withEvent:(UIEvent *)event {
    UIView *parent = self.superview.superview.superview;    

    Person *s = nil;
    for( UIView *child in self.subviews ){
        if( [child isKindOfClass:[Person class]] ){
            s = child;
            s removeFromSuperview];
            break;
        }        
    }

    if( s != nil ){
        self.userInteractionEnabled = NO;
        s.userInteractionEnabled = YES;
        UITableView *subParent = self.superview;   //EDIT #1
        subParent.scrollEnabled = NO;              //EDIT #1

        [parent addSubview:s];
        //[self touchesEnded:touches withEvent:event]; //EDIT #1
    }
}

Il est important de noter le drapeau userInteractionEnabled se Basculé, la méthode ci-dessus. Avant le toucher, l'objet personne est « hors limites » au toucher d'une personne. Après la cellule attrape personnalisée un mouvement, la personne est libérée en l'ajoutant à l'avis du parent puis activé (userInteractionEnabled = OUI). L'objet personne est alors « né » et peut gérer des touches de déplacement sur son propre.

a un petit problème mineur en ce que l'objet clignote personne dans le coin supérieur gauche, mais tombe alors immédiatement sur le doigt de l'utilisateur.

La dernière partie de cette conception est que le UIView maître doit gérer une « transition tactile. » Lorsque l'utilisateur touche la table et l'objet Personne s'émergea, les besoins d'applications pour se rendre compte que les besoins de mise au point à retirer de la table et dirigé vers l'objet Personne. La façon dont cela a été fait est que la méthode hitTest dans le maître UIView était surchargé avec ce qui suit.

- (UIView*) hitTest:(CGPoint)point withEvent:(UIEvent *)event {
    UIView *rv = nil;
    for(UIView *child in self.subviews){
        if( [child isKindOfClass:[Person class]] ){
            rv = child;
            child.center = point;
            break;
        }
    }
    if( rv == nil ){
        rv = [super hitTest:point withEvent:event];
    }   
    return rv;
}

La façon dont ce code fonctionne, est que lorsque la personne est émergea de la table, il ne dispose pas d'une touche concentrée à elle. La touche « appartient » par le UITableView à partir de laquelle la personne a été sauté sur. La méthode hitTest est la clé de recentrant cette touche. Régulièrement, le système vérifie pour voir qui UIView est au centre d'une touche. La méthode hitTest est appelée par le système pour identifier que UIView. Lorsque la personne est attachée à la vue principale, cette fonction hitTest à travers tous les sous-vues itère et détecte la présence de la personne et le renvoie comme l'objet touché « dominante ». Tout mouvement de votre doigt sera signalée immédiatement à la personne et non au UITableView.

Ceci est la mise en œuvre de courage. Avoir un UITableView « attraper » l'objet en mouvement est simple maintenant et je vais le laisser pour vous d'essayer!    Si vous avez des questions, s'il vous plaît les poster!

EDIT # 1    Laissant tomber l'objet Personne se révèle plus difficile que je pensais :). Je devais ajouter une ligne pour empêcher le UITableView de défilement lorsque le parent est déplacé autour parce que le UITableView suce dans tous les événements de mouvement.
   Les feux de fonction touchesEnded dans la classe UITableViewCell personnalisée.
        mj

Était-ce utile?

La solution

Salut j'ai réussi à créer glisser-déposer d'une ligne dans un UITableView sur une autre ligne de la même table. Je créé un UIImageView représentant l'élément en mouvement (ce qui n'a pas été supprimé de la table) et fixée à la UIView en avant de ce fait déplaçable sur l'écran. Voici quelques post sur la peine que je dû faire face:

  1. UITableView: glisser une rangée sur un autre
  2. UITableView: défilement de la programmation afficher le contenu
  3. UITableView: gestes personnalisés font défiler plus

Espérons que cela peut aider ^^

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top