Comment définir des sous-vues avec mise en page automatique dans UIScrollView par programmation?
Je suis entrain de créer une application avec des UiScrollview et UIPagectontrol à l'aide de mise en page automatique Progrmatically, pour
J'ai Créé TKScroller en tant que sous-classe de UIView, je suis initialisation à l'aide de Certaines de Mode et de Tableau.
TKScroller.m
-(void)setData{
[self layoutIfNeeded];
CGRect mainFrame=self.frame;
[self layoutIfNeeded];
CGRect mainFrame=self.frame;
UIView *lastview;
NSMutableArray* manualConstraints = [NSMutableArray array];
for (int i=0; i<arrayData.count ; i++)
{
CGRect frame;
frame.origin.x = scrollView.frame.size.width * i;
frame.origin.y = 0;
frame.size = scrollView.frame.size;
UIView *subview = [UIView new];
subview.backgroundColor = [self getRandomColor];
[scrollView addSubview:subview];
if (i==0)
{
NSLayoutConstraint* b1_top = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:5];
[manualConstraints addObject:b1_top];
NSLayoutConstraint* b1_left = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeLeading multiplier:1 constant:5];
[manualConstraints addObject:b1_left];
NSLayoutConstraint* b1_right = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTrailing multiplier:1 constant:-5];
[manualConstraints addObject:b1_right];
NSLayoutConstraint* b1_bottom = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:-10];
[manualConstraints addObject:b1_bottom];
[subview layoutIfNeeded];
[scrollView addConstraints:manualConstraints];
lastview=subview;
}
else{
NSLayoutConstraint* b1_top = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTop relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:5];
[manualConstraints addObject:b1_top];
NSLayoutConstraint* b1_left = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeLeading relatedBy:NSLayoutRelationEqual toItem:lastview attribute:NSLayoutAttributeLeading multiplier:1 constant:5];
[manualConstraints addObject:b1_left];
NSLayoutConstraint* b1_right = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeTrailing relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTrailing multiplier:1 constant:-5];
[manualConstraints addObject:b1_right];
NSLayoutConstraint* b1_bottom = [NSLayoutConstraint constraintWithItem:subview attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:scrollView attribute:NSLayoutAttributeTop multiplier:1 constant:-10];
[manualConstraints addObject:b1_bottom];
[subview layoutIfNeeded];
[scrollView addConstraints:manualConstraints];
lastview=subview;
}
}
scrollView.contentSize = CGSizeMake(scrollView.frame.size.width * arrayData.count, mainFrame.size.height/2);
self.pageControl.currentPage = 0;
self.pageControl.numberOfPages = arrayData.count;
pageControlBeingUsed = NO;
}
-(UIColor *)getRandomColor{
int r = arc4random() % 255;
int g = arc4random() % 255;
int b = arc4random() % 255;
return [UIColor colorWithRed:(r/255.0) green:(g/255.0) blue:(b/255.0) alpha:1.0];
}
Droit maintenant, je me fais tout les sous-vues,
mais si je change d'orientation qu'il donnera un résultat incorrect, Alors comment puis-je donner NSLayoutConstraint
pour les sous-vues de la scrollview ?
MODIFIER
Après l'ajout de NSLayoutConstraint
des sous-vues ne sont pas affichés. Je suis juste en manque certaines contraintes , s'il vous plaît corrigez-moi dans la définition de contraintes de manière dynamique.
Mon Le Code Source est ici , S'Il Vous Plaît Aider Moi.
Je vous remercie. Et Désolé pour la mauvaise grammaire.
va hors de la vue.
Tout d'abord, si vous ne
AutoLayout
de la programmation, je vous le conseille l'utilisation de ce grand Cadre cela rendra votre vie beaucoup plus facile et votre code tellement lisible 😉Merci pour votre suggestion, je ne veux pas utiliser d'autres classes de ce. s'il vous plait pouvez-vous aider mon œuvre, je suis juste en manque somethong peu.
Voyez-vous des informations à afficher dans la console de débogage lors de la rotation de l'appareil? E. g. Incapable de satisfaire simultanément des contraintes. Habituellement, la console de débogage vous donnera un indice sur le pourquoi de la vue ne s'affichent pas correctement. Vous devez également être le réglage de translatesAutoresizingMaskIntoConstraints = NO sur la sous-vues.
OriginalL'auteur user203108 | 2014-02-21
Vous devez vous connecter pour publier un commentaire.
Voici une réponse a expliqué comment faire cela avec mise en page automatique, il dispose d'expliquer parfaitement , ici il est à la verticale textfields sont là, Mais dans votre cas, c'est que vous devez définir Horizontale vues contraintes.
Alternative
Plutôt que de l'ajout de contraintes, vous pouvez définir la juste image de la sous-vue et de les mettre en Scrollview, Et sur la base de l'orientation, vous pouvez changer les cadres de la scrolview de sous-vues.
Votre Méthode setData comme,
Maintenant vous aide NSNotificationCenter vous pouvez obtenir de l'avertir lorsque le dispositif d'orientation chaged, de manière à ce sélecteur de mode de l'appeler votre
setData
méthode,Maintenant dans votre méthode setData vous devez supprimer tous les sous-vues, car lorsque l'appareil changements d'Orientation, il va ajouter de nouveaux points de vue à vos scrollview, afin de supprimer tous les sous-vue de Scrollview avant de définir son cadre,
Assurez-vous que vous êtes en train de supprimer observateur de votre classe,
NSNotificationCenter
observateur ?Comme vous le dites, il est de coutume de classe de façon à ce droit dans
init
méthode de cela, vous avez mis en oeuvre cette méthode??oui je l'avais écris
-(id)initWithFrame:(CGRect)frame array:(NSMutableArray *)array mode:(ScrollerMode)mode
méthode,et assurez-vous de supprimer cet observateur.
il serait très remercier complet si vous écrivez du code pour que,
OriginalL'auteur Toseef Khilji
Dans mon expérience avec
AutoLayout
(que j'utilise par programmation). Vous ne devez pas ajouter de points de vue directement à votreUIScrollView
.Vous devriez faire un
UIView
et un seul, que vous ajoutez en tant que sous-vue de votreUIScrollView
.Une fois cela fait, vous pouvez ajouter tous vos sous-vues à ce
UIView
.Tout est expliqué en détail ici : Apple iOS Note Technique TN2154
UIView > UIScrollview
et dans le scrollview aussi, je suis en ajoutant un point de vue, et dans le lien de référence a vue unique, j'ai du ajouter de multiples points de vue dans les uiscrollview.Ce n'est pas ce que j'ai lu dans votre code, vous ne
[scrollView addSubview:subview];
dans unfor
déclaration, vous devez ajouter le nombre de vues de votreUIScrollView
en référer lien qu'ils ont utilisé
NSLayoutConstraint
avec constraintsWithVisualFormat , je ne suis pas en mesure de faire dans mon cas, j'ai donc utilisé d'autres NSLayoutConstraint.j'ai du ajouter des vues dans uiscrollview parce que je veux funcationality comme
iPhone
app Photos, mais avec contrôle pagecontrol.. ALORS dis-moi comment puis-je obtenir galerie + contrôle pagecontrol fonctionnalités sans ajout de sous-vues pour le scrollview.Peut-être que vous pouvez lire attentivement ma réponse... j'explique ce que vous devez faire
UIScrollView > UIView > UIView[](your photos)
. Et si j'étais vous, je ferais unUICollectionView
avec de défilement horizontale et la pagination est activée, il doit faire ce que vous voulez dans un moyen plus simple 😉 (Mais je n'ai jamais essayé d'avoir une horizontaleUICollectionView
je l'avoue)OriginalL'auteur AncAinu
Je sais que le problème a été résolu. et j'espère que cette solution de mon aide pour certaines personnes, je suis donc de le poster.
Code ci-dessous est pour l'ajout de la scrollview à la uiviewcontroller
Après l'ajout de la scrollview et ajouter les sous-vues/images comme ceci(c'est un exemple pour les images montrant en pleine taille de la scrollview comme dans l'application photos )
OriginalL'auteur sateesh
Si vous voulez que votre TKScroller fixe au centre et à soutenir les changements d'orientation, vous pouvez simplement mettre le code suivant dans votre init
et vous pouvez avoir besoin de vérifier tous vos sous-vue de TKScroller. Si vous n'aimez pas le redimensionnement automatique , vous pouvez définir (un des trois)
setTranslatesAutoresizingMaskIntoConstraints:NO
), mais je ne pense pas que c'est ce que l'OP veut.OriginalL'auteur Baoyu