2009-09-16 4 views
1

Je travaille sur une vue qui me permettrait d'afficher de grandes quantités de texte, et de le parcourir en affichant une page à la fois et en permettant à l'utilisateur de faire défiler la gauche.Comment naviguer dans plusieurs pages de texte en utilisant la pagination

Je pensais pouvoir le faire en plaçant UITextView dans un UIScrollView dont la propriété pagingEnabled est définie sur YES avec la définition de la largeur du contenu sur un multiple de l'écran. Tout ce que je vois est la première page, même si je peux feuilleter vers la droite et voir d'autres pages vierges. Quelqu'un peut-il donner des conseils. Voici le code ...

label = [[UITextView alloc] initWithFrame: scroller.frame]; 

label.editable = NO; 

label.scrollEnabled = NO; 

label.multipleTouchEnabled = NO; 

label.userInteractionEnabled = NO; 

label.font = [UIFont systemFontOfSize: 14.0]; 

// Get text 
std::string str; 

// Next line gets a single string, which is from 2000 to 8000 

//characters long 
str = GetStringContent(); 

NSString * nsStr = [NSString stringWithCString: str.c_str()]; 

// Measure text that will display in one page. 
CGRect rect = CGRectMake(0.0, 0.0, scroller.frame.size.width, scroller.frame.size.height); 
CGSize calcSize = [nsStr sizeWithFont: [UIFont systemFontOfSize: 14.0] 
constrainedToSize: rect.size lineBreakMode: UILineBreakModeWordWrap]; 
rect.size = calcSize; 

CGRect maxRect = CGRectMake(0.0, 0.0, self.view.bounds.size.width, 99999.0); 

CGSize maxCalcSize = [nsStr sizeWithFont: [UIFont systemFontOfSize: 14.0] 

constrainedToSize: maxRect.size lineBreakMode: UILineBreakModeWordWrap]; 

float pages = maxCalcSize.height/self.view.bounds.size.height; 

int numberOfPages = (int)ceil(pages); 

// Set text 
label.text = [NSString stringWithCString: str.c_str()]; 

// Setup scroller 
scroller.scrollEnabled = YES; 

scroller.pagingEnabled = YES; 

scroller.bounces = YES; 


scroller.contentSize = CGSizeMake(label.frame.size.width * numberOfPages, scroller.frame.size.height); 


scroller.contentOffset = CGPointMake(0, 0); 

scroller.frame = rect; 

scroller.clipsToBounds = YES; 

[scroller addSubview: label]; 

[label sizeToFit]; 

La vue est créée dans IB, et l'UIScrollView a été ajouté en IB avec « changeurs » étant le nom de la sortie. J'ai travaillé sur cela pendant un moment, et j'ai l'impression de manquer quelque chose de fondamental sur UIScrollView, parce que je n'arrive pas à le faire fonctionner.

Paul

Répondre

2

Paging signifie simplement que le scrollview va « casser » à la largeur de la vue de défilement. Ce qui signifie que lorsque vous balayez vers la gauche, la page suivante viendra mais s'arrêtera à l'incrément de 320, ow quelle que soit la largeur que vous avez.

Pour faire ce que vous souhaitez faire, il vous faudra un peu plus de code que vous avez. Je commencerais par faire 3 vues de texte et les garder dans un tableau, vous n'en montrerez que 1 à la fois.

Vous devrez implémenter la logique pour déterminer ce qu'il faut afficher sur ces textviews (quelle partie du texte afficher) et utiliser cette logique pour remplir la page en cours, la page précédente et la page suivante.

Vous aurez besoin d'écouter les méthodes de délégué de UIScrollView savoir quelle page vous êtes, et vous devrez recalcule et remplir les pages que l'utilisateur fait défiler

Si l'utilisateur fait défiler à la page suivante, vous prenez le texte que vous aviez depuis 2 pages et déplacez-le pour devenir la nouvelle page "suivante". Ceci est appelé "recyclage" de vos opinions et il ya plenty of questions on SO à ce sujet avec l'exemple de code

+1

Merci beaucoup pour expliquer cela. J'ai fait beaucoup de recherches à ce sujet et c'est l'explication la plus claire que j'ai trouvée, et j'ai fait beaucoup de recherches sur Google. En lien avec la logique d'implémentation pour savoir ce qu'il faut afficher, existe-t-il une méthode pour NSString similaire à sizeWithFont: constraintToSize: qui indiquera également la quantité de texte qui est dessinée, dans la zone contrainte? Merci. –

+0

Je ne suis pas sûr d'aucune main mais vous pouvez vérifier les docs. Je suppose que votre texte n'est pas formaté avec des sauts de ligne? Peut-être que l'utilisation d'une taille de police constante, d'une police à espacement fixe et d'un nombre de caractères (sans casser les mots) est la meilleure façon de le faire – coneybeare

Questions connexes