7
votes

ScrollView affichant seulement la dernière sous-Sous-StatView

Je reçois un comportement étrange avec UiscrollView code> Sous-Views, l'idée est de créer une instance de uiview code> avec un fichier NIB personnalisé qui est un formulaire dans mon cas, remplir Cela forme avec des données d'une classe de modèle et l'ajoutez sous forme de sousview pour mon Uiscrollview code>. Le problème strud> est lorsque je traiterai plus d'une sous-visView, le uiscrollview CODE> Ne gardez que la dernière sous-visVIEW, donc si j'ai créé trois sous-espoirs, la vue ScrollView n'indique que le troisième (la Dernière sousview. Bien que le contrôle de page soit défini sur le numéro CURECT de sous-visVIEWS (trois).

Le projet est trop long, je vais donc essayer d'expliquer grofly mon problème avec le code p> p> p>

   |    |    |    | <AppTableView: 0x1eef4700; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 990; layer = <CALayer: 0x1eef4790>>

   |    |    |    | <AppTableView: 0x1ee3f380; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 991; layer = <CALayer: 0x1ee3f410>>

   |    |    |    | <AppTableView: 0x1ee56910; frame = (0 18; 600 430); autoresize = LM+RM+TM+BM; tag = 992; layer = <CALayer: 0x1ee3f410>>


11 commentaires

Quand vous dites "Allez à une autre vue et revenez à cette vue", est-ce que cette vue est reconstruite? Je suppose que ce n'est pas; que -ViewDidLoad est appelé uniquement avant la première fois et le problème est ailleurs dans votre code.


Oui, c'est en train d'être reconstruit, car quand j'ai quitté cette vue, les données sont stockées sur le modèle, puis lorsque je revenir en arrière, les données sont récupérées et que les sous-étapes sont reconstruites. Ce que vous voulez dire -ViewDidIdload est appelé avant la première fois I enregistré avec des points d'arrêt et ViewDidload est toujours appelé lorsque vous arrivez à la vue.


Ok, alors si vous obtenez un résultat différent dans différents appels vers -ViewDidLoad , ce qui change entre les deux appels?


Bonjour, dans chaque appel, j'ai vérifié le contenu , image , données, etc. Tout va bien, pourquoi la vision de ScrollView maintient toujours la dernière itération du pour BOOP, bien qu'il dessine l'espace nécessaire pour contenir toutes les sous-espions, mais en montrant seulement l'une d'elles?


Où est-ce que votre pour boucle de boucle? Et vous devez probablement nous montrer le code pour -AnddmoreView .


Bonjour, j'ai édité ma question avec le code de la méthode qui dessine chaque fois une nouvelle sous-vision, veuillez jeter un coup d'œil. Merci.


Ce que vous dites, c'est que vous obtenez de l'espace alloué à 3 sous-espoirs, mais lorsque vous naviguez vers une autre vue et que vous recevez, vous obtenez uniquement le dernier affichage visible où tous les 3 étaient visibles avant droite? Contre-commande Pour vérifier si les sous-espions sont là, essayez de leur donner une couleur de fond. S'ils sont là, vous pouvez les voir.


Exécutez votre application. Une fois qu'il affiche votre vue sur le défilement à l'écran (incorrectement, avec une seule sous-système visible), faites une pause dans le débogueur. Exécutez cette commande dans la console de débogage: PO [[UIAPP KeyWindow] recursivedescription] Copiez la sortie et collez-la dans votre question.


Bonjour, s'il vous plaît jeter un oeil sur mon édition, merci.


@Malloc Vous n'avez pas montré le code où vous vous connectez startx .


@android Je l'ai enregistré avant et après l'ajout de nouvelle sous-Sous-StatView à la ScrollView.


7 Réponses :


0
votes

Ce bloc de code dans -AnddmoreView est le problème: xxx

si startx ne change jamais, vous ajoutez tout ces vues au même endroit.


3 commentaires

Ah, c'est une faute de frappe, désolé, j'ai mis à jour mon post à nouveau, j'ai utilisé une variable statique qui est réinitialisée à 0 sur charge, puis elle est incrémentée par la largeur de la sous-évaluation pour commencer à dessiner sur le nouveau x position à chaque fois.


Je vous suggère d'ajouter un peu de débogage dans -AnddmoreView pour imprimer chaque sousview de votre ScrollView: pour (uIView * V dans self.scrollview.subviews) {nslog (@ "% @", V) ;} et assurez-vous que vous avez autant de sous-espaces que vous attendez et que leurs cadres sont corrects, etc.


Salut Seamus, j'ai déjà débogué cela aussi, et la largeur, la hauteur et la position de position Y sont les mêmes pour toutes les sous-espoir, seule la position X change d'une sous-système à une autre.



0
votes

Vous ne définissez sûrement pas la taille du contenu correctement pour 3 éléments: xxx

doit être xxx

i présume lorsque vous faites défiler horizontalement sur The ScrollView, la taille du contenu ne permet que suffisamment de place pour une sous-évaluation correcte?


1 commentaires

Salut, merci, j'ai essayé votre suggestion avec un banc d'autres proviseurs autour. Malheureusement, aucun n'a corrigé mon problème.



2
votes

Tout d'abord, vous devez d'abord placer le [Super ViewDidLoadload] Appeler en haut de votre - (vide) ViewDiDloadload , pas en bas.

Étant donné que ce n'est pas assez clair ce que vous voyez réellement et ce que vous attendez de voir, fournir un exemple de travail minimum de votre problème en tant que projet téléchargeable nous aiderait à vous aider. Si vous essayez simplement de reproduire cela dans un contrôleur d'affichage séparé qui n'interagit pas avec des objets gérés, mais utilise des données fournies statiquement, d'autres pourront la reproduire eux-mêmes et la déboguer. Ou vous pourriez aussi bien comprendre vous-même dans le processus.


0 commentaires

0
votes

Utilisé une variable statique qui est réinitialisée à 0 sur charge, elle est incrémentée par la largeur de la sous-évaluation pour commencer à dessiner sur la nouvelle position X.


0 commentaires

0
votes

Essayez de définir le AutorésizeMask d'AVIAW sur UIViewAutoresizingNone à l'intérieur de la méthode addmoreview.


2 commentaires

UIViewAutoresizingNone est la valeur par défaut de la propriété AutorésizeMask .


À partir de votre journal, le masque automobile APTTableView Autorésize est LM + RM + TM + BM.



0
votes

i créé un projet qui utilise votre code dans la poche sœur et Son travail juste bien. J'ai ajouté plusieurs tests sur les masques automobiliaires comme vous pouvez le voir ci-dessous. Je vous suggère de comparer cela à ce que vous faites. Des choses étranges se produisent lorsque les masques sur les sous-espoirs ou la vision de ScrollView ne sont pas définis pour être liés au sommet / à gauche.

Mon code modifié: p>

NSArray *colors = @[ [UIColor redColor], [UIColor greenColor], [UIColor blueColor] ];

UIViewAutoresizing mask;
mask = [self.scrollView autoresizingMask];
//assert(!self.scrollView.autoresizesSubviews); // has no affect here

if((mask & (UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin)) != mask) NSLog(@"scrollView MASK WRONG");

for (int i=0; i<3; ++i) {

    NSArray *arr = [[NSBundle mainBundle] loadNibNamed:@"AppTableView" owner:self options:nil];

    NSLog(@"scrollView frame: %@", NSStringFromCGRect(self.scrollView.frame));
    if((mask & (UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin)) != mask) NSLog(@"aView MASK WRONG");

    AppTableView *aView = [arr objectAtIndex:0];
    assert([aView isKindOfClass:[AppTableView class]]);
    NSLog(@"orig aView frame: %@", NSStringFromCGRect(aView.frame));
    UIViewAutoresizing mask = [aView autoresizingMask];
    if((mask & (UIViewAutoresizingFlexibleRightMargin|UIViewAutoresizingFlexibleBottomMargin)) != mask) NSLog(@"aView MASK WRONG");


    aView.frame = CGRectMake(startX, 0, aView.bounds.size.width, aView.bounds.size.height);
    NSLog(@"changed aView frame: %@", NSStringFromCGRect(aView.frame));
    aView.backgroundColor = colors[i];

    [self.scrollView addSubview:aView];
    self.scrollView.contentSize = CGSizeMake(self.scrollView.contentSize.width+aView.frame.size.width
                                             ,self.scrollView.contentSize.height);
    startX = startX + aView.frame.size.width;

   //AppTableView *_appTableView = (AppTableView *) [[self.scrollView subviews] lastObject];

    //_appTableView.txtADDRESS.text = _appTable.address;//Fill in the form, no need to write all the form fields code because it's the same way.
}
NSLog(@"scrollView frame: %@", NSStringFromCGRect(self.scrollView.frame));
NSLog(@"scrollView contentOffset: %@", NSStringFromCGPoint(self.scrollView.contentOffset));


0 commentaires

1
votes

Je suis de retour un peu en retard, mais finalement, je trouve le correctif pour mon problème alors pensait que c'est bon de la partager pour sauver la durée de quelqu'un d'autre.

Pour mon cas, le ScrollView est une vue personnalisée dans un fichier NIB. Donc, en activant ses masques d'autostimation à gauche et en haut, le bogue a été corrigé.

Entrez la description de l'image ici


0 commentaires