# iPhone : scrolling



## Chamalo (4 Mars 2010)

Bonjour a tous,

Je debut en programmation iPhone et en essayant de me faire une petite app pour apprendre, je me retrouve face a un probleme des plus basique (enfin je pense).

J'ai une view qui m affiche une image et en dessous du texte. 
Je charge ce texte dans un fichier ressource.
Probleme, le texte que j affiche reste uniquement dans la boxe que j ai dessiné sur l interface.

je voudrais que la dimension de mon TextView s etire automatiquement en fonction de la longueur du texte, pour pouvoir scroller sur la page entiere et non sur la taille par default du composant.

C est une fonction classique qu on retrouve partout sur toutes les appli qui affiche du texte, mais je ne trouve pas comment faire.

J ai essayé de mettre mes deux composants (image et texte) dans un Scroll view, mais ca ne change rien.

Si quelqu'un (qui comprend ce au j essaie d expliquer) peux m aider svp 

Merci


----------



## Rez2a (4 Mars 2010)

Salut,
je suis un peu pressé et je ne peux pas tester ça tout de suite, mais je pense qu'il faut effectivement utiliser une ScrollView dans laquelle tu mettras tes ImageView et TextView.
Pour le scroll, il faut définir la contentSize de la ScrollView.

Par exemple :

UIScrollView *scrollView = [[UIScrollView alloc] init];
scrollView.contentSize = CGSizeMake (int width, int height);

Avec bien sûr width et height qui correspondront à la largeur et hauteur voulues, déjà teste un CGSizeMake(320,800) (bref une size où la height est supérieure à 480) pour voir si le scroll est bien activé.

Il faut bien sûr pas mettre une size au hasard mais la calculer en fonction des tailles des éléments affichés, genre un CGSizeMake(320, imageView.size.height+textView.size.height).

À toi de voir, hésite pas à répondre pour savoir si ça fonctionne et on pourra t'aider en fonction, désolé mais là j'ai vraiment pas le temps de tester.

N'oublie pas de vérifier que la propriété userInteractionEnabled de la scrollView soit à YES pour permettre le scroll, par défaut il me semble que c'est le cas mais ça coûte rien de jeter un oeil.

[Edit]
Ça me paraît évident mais le code que j'ai écrit au-dessus n'est pas vraiment correct ; soit tu déclares ta ScrollView dans le header en IBOutlet pour la lier à l'interface avec Interface Builder (et tu l'initialises avec un scrollView = [[UIScrollView alloc] init] après l'avoir déclarée comme property dans le header puis un synthesize dans le .m), soit tu la crées entièrement depuis le code, mais il faudra l'ajouter comme subView à ton controller actuel.


----------



## Chamalo (4 Mars 2010)

Merci pour la reponse, mais je n y arrive toujours pas.

Comment faire pour que le TextView se resize automatiquement en fonction de la longueur du texte ? (je ne trouve pas de fonction pour faire ce calcul).
Si ma Textview est a la bonne taille, je pense que tout fonctionnera ensuite (grace a ton code).
Car pour le moment le scrollView prends la mauvaise taille.

Ca me parait etre un cas simple, mais je ne sais pas quoi chercher sur google poru trouver un exemple.

Merci de ton aide


----------



## ntx (4 Mars 2010)

Comment veux-tu augmenter la taille d'un contrôle sans modifier aussi la taille de la vue qui le contient, et de la vue qui contient la vue qui le contient ...  Tu mets ta scrollbar à quel niveau ?  Un petit schémas ?


----------



## Rez2a (4 Mars 2010)

Chamalo a dit:


> Merci pour la reponse, mais je n y arrive toujours pas.
> 
> Comment faire pour que le TextView se resize automatiquement en fonction de la longueur du texte ? (je ne trouve pas de fonction pour faire ce calcul).
> Si ma Textview est a la bonne taille, je pense que tout fonctionnera ensuite (grace a ton code).
> ...



En admettant que ta TextView s'appelle textView, et que tu la cales aux coordonnées 0,0 avec une width de 320 et une height ajustée au contenu :
textView.text = taVariableQuiContientLeTexte;
textView.frame = CGRectMake(0, 0, 320, textView.contentSize.height);
scrollView.contentSize = CGSizeMake(320, textView.frame.size.height + imageView.frame.size.height);

(Je m'étais trompé au-dessus, la propriété size est contenue dans la frame).


----------



## Chamalo (5 Mars 2010)

Ce que je voulais dire c est que tant que ma textView ne se redimensionne pas automatiquement par rapport a la longueur du texte que je mets dedans, je ne peux pas resizer la scrollView (vu que ca taille depend tu textview).

Merci Rez2a, je teste ca tout de suite.

---------- Nouveau message ajouté à 17h42 ---------- Le message précédent a été envoyé à 16h57 ----------

Bon je n'y arrive toujours pas.
La scrollview se deplace et je peux voir tout le texte, mais des que je relache le clic souri, ca reviens au debut.
Donc je suppose que la scrollView n'a pas la bonne taille.

J ai essayé de faire des NSLog des valeur et j obtiens toujours 0;
Voila mon code:


```
- (void)viewDidLoad {
    
    scrollView = [[UIScrollView alloc] init];
    
    NSString* content = [project objectForKey:DESCRIPTION_KEY];
    NSString* imgpath = [project objectForKey:IMAGE_PATH_KEY];
    
    textView.text = content;
    imgView.image = [UIImage imageNamed:imgpath];
    
    self.view.backgroundColor = [UIColor colorWithPatternImage:[UIImage imageNamed:@"background.png"]];
    
    textView.frame = CGRectMake(textView.frame.origin.x, textView.frame.origin.y, textView.frame.size.width, textView.contentSize.height);
    scrollView.contentSize = CGSizeMake(320, textView.frame.size.height + imgView.frame.size.height);
    
    NSLog(@"scroll size : %d", scrollView.contentSize.width);
    NSLog(@"text size : %d", textView.frame.size.width);
    
    [scrollView dealloc];
    [super viewDidLoad];
}
```


----------



## Chamalo (6 Mars 2010)

Ok j ai trouvé mon probleme ....

Il ne faut pas initialiser la scrollview dans le code.
Sans ca fonctionne parfaitement .

Merci pour votre aide en tout cas


----------



## Rez2a (10 Mars 2010)

J'ai été de nouveau confronté à ce problème aujourd'hui. 
Apparemment, il faut que la ScrollView soit ajouté à une view pour qu'on puisse accéder à sa contentSize... en l'initialisant par le code, il faut donc faire un [grosseViewQuiContientTout addSubView:scrollView] avant de s'amuser à calculer la contentSize & cie.
Désolé pour mon exemple qui t'a induit en erreur, mais ça avait marché chez moi car la ScrollView avait été créée avec IB donc déjà ajoutée à une View... et effectivement, en faisant tout par le code, c'est pas la même limonade.


----------

