Je me suis amusé avec un moyen de justifier l'alignement d'une collection de sous-classes UIView dans une vue contenant. J'ai un peu de mal avec l'algorithme et espérais que quelqu'un pourrait aider à repérer mes erreurs. Voici le pseudo-code de l'endroit où je suis maintenant:Justifier UIVIews sur l'iPhone: Algorithm Help
// 1 see how many items there are
int count = [items count];
// 2 figure out how much white space is left in the containing view
float whitespace = [containingView width] - [items totalWidth];
// 3 Figure out the extra left margin to be applied to items[1] through items[count-1]
float margin = whitespace/(count-1);
// 4 Figure out the size of every subcontainer if it was evenly split
float subcontainerWidth = [containingView width]/count;
// 5 Apply the margin, starting at the second item
for (int i = 1; i < [items count]; i++) {
UIView *item = [items objectAtIndex:i];
[item setLeftMargin:(margin + i*subcontainerWidth)];
}
Les items ne semblent pas être espacés uniformément ici. Pas même proche. Où vais-je mal?
Voici un coup de cet algorithme en action: alt text http://grab.by/1Wcg
EDIT: Le code ci-dessus est pseudocode. J'ai ajouté le code réel ici, mais il pourrait ne pas avoir de sens si vous n'êtes pas familier avec le projet de trois20.
@implementation TTTabStrip (JustifiedBarCategory)
- (CGSize)layoutTabs {
CGSize size = [super layoutTabs];
CGPoint contentOffset = _scrollView.contentOffset;
_scrollView.frame = self.bounds;
_scrollView.contentSize = CGSizeMake(size.width + kTabMargin, self.height);
CGFloat contentWidth = size.width + kTabMargin;
if (contentWidth < _scrollView.size.width) {
// do the justify logic
// see how many items there are
int count = [_tabViews count];
// 2 figure out how much white space is left
float whitespace = _scrollView.size.width - contentWidth;
// 3 increase the margin on those items somehow to reflect. it should be (whitespace)/count-1
float margin = whitespace/(count-1);
// 4 figure out starting point
float itemWidth = (_scrollView.size.width-kTabMargin)/count;
// apply the margin
for (int i = 1; i < [_tabViews count]; i++) {
TTTab *tab = [_tabViews objectAtIndex:i];
[tab setLeft:(margin + i*itemWidth)];
}
} else {
// do the normal, scrollbar logic
_scrollView.contentOffset = contentOffset;
}
return size;
}
@end
Salut. Puisque toutes vos valeurs (margin et subcontainerWidth) sont calculées avant la boucle et ne changent pas au fur et à mesure de l'exécution de la boucle, l'appel à setLeftMargin est considéré comme le coupable possible. Comment fonctionne setLeftMargin? (Je ne trouve pas de document pour cela!) – deanWombourne
Quelle est la différence entre containerView et containingView? Il semble que item soit une vue personnalisée car setLeftMargin n'est pas dans les documents d'Apple. Pouvez-vous poster un peu plus de code, surtout cette méthode? –
containsView et containerView sont les mêmes. C'était une faute de frappe. Rappelez-vous, ceci est juste un pseudocode. Je vais poster le code actuel, mais cela n'a pas de sens parce que j'utilise trois20. – coneybeare