2010-05-09 4 views
2

J'ai un UIView dans un UIScrollView que je veux redimensionner.Redimensionner un UIView - étendre le top

je peux augmenter la hauteur facilement:

CGRect frame = self.drawinView.frame; 
frame.size.height += 100; 
self.drawinView.frame = frame; 
self.drawinScrollView.contentSize = CGSizeMake(frame.size.width, frame.size.height); 

Et tout est bon.

Le code ci-dessus va créer une nouvelle zone de la vue au bas de la vue que je peux remplir. Maintenant, lorsque je redimensionne la vue, je veux seulement repeindre la nouvelle partie de la vue qui vient d'être créée. Je ne veux pas avoir à repeindre toute la vue.

Cependant! J'ai rencontré des difficultés lorsque j'ai besoin d'élargir le haut de la vue.

Faire:

CGRect frame = self.drawinView.frame; 
frame.origin.y -= 100; 
self.drawinView.frame = frame; 
self.drawinScrollView.contentSize = CGSizeMake(500, 600); 

ne fonctionne pas.

Comment est-ce que je peux faire ceci sans devoir repeindre la vue entière?

Répondre

1

Vous pouvez définir la taille du contenu sur n'importe quel grand nombre, mais vous ne pouvez jamais faire défiler plus à gauche ou plus haut que le coin supérieur gauche à 0,0. Si vous avez une vue avec y à -100, il ne vous laissera pas défiler jusqu'à 100px au-dessus de 0.

Au lieu de cela, vous devez le laisser où il est et placez plutôt le contentOffset à +100 verticalement.

Si, par exemple, vous voulez redimensionner la vue par 100px, vous feriez ceci:

CGRect frame = self.drawinView.frame; 
frame.size.height += 100; 
self.drawinView.frame = frame; 
self.drawinScrollView.contentSize = CGSizeMake(frame.size.width, frame.size.height); 
self.drawinScrollView.contentOffset = CGPointMake(0,100); 

Vous feriez un peu comment avoir à dire manuellement le drawinView que vous voulez verrouiller le contenu à la bas de la vue au lieu du haut.

+0

Ok, cela a du sens .. Je soupçonne que dire à DrawinView de verrouiller le contenu vers le bas impliquerait de le faire repeindre toute la toile? J'espérais éviter cela .. Peux-tu penser à une autre façon? –

+0

Je ne suis pas sûr de l'une des choses suivantes: Il y a la propriété contentMode de la classe UIView. Si vous le définissez sur UIViewContentModeBottom, alors lorsque vous redimensionnez la vue, il devrait automatiquement appeler repaint et peut-être qu'il ne passera que dans le rectangle sale pour la zone révélée en haut. Sinon, vous pouvez toujours seulement dessiner cette zone et ne pas effacer le contexte avant de dessiner. (view.clearsContextBeforeDrawing = false) –

+0

Ok, je n'ai pas essayé cela .. J'accepte le peu de votre réponse qui vient de dire que vous ne pouvez pas mettre les numéros! Ce que j'ai fait à la place, c'est de travailler sur la taille maximale de la toile dont j'ai besoin dans tout le scénario et ensuite de limiter le défilement manuellement. Cela donne le même effet et le rend un peu plus rapide! Je me pencherai sur ce ContentMode quand j'aurai le temps. Merci pour l'aide! 8 ^) –

0

Dans le code ci-dessus, vous modifiez uniquement l'origine de la vue. Pas sa taille.

+0

Je peux aussi changer sa taille: frame.size.height + = 100; cela ne fonctionne pas. Il ajoute une zone au bas de la vue. –