2009-09-18 9 views
5

J'ai été incapable de trouver la réponse à ce problème.Center UIImageView dans UIScrollView sans contentInset?

J'ai un UIImageView à l'intérieur d'un UIScrollView, et je voudrais le centre son contenu verticalement.

À l'heure actuelle, la seule façon d'y parvenir est de régler le contentIn de la vue défilement en fonction de la hauteur de la taille UIImageView, mais ce n'est pas une solution parfaite; cela augmente simplement la taille de UIImageView, ce qui fait que UIScrollView pense que son contenu est plus grand et ajoute ces barres noires en haut.

J'ai essayé d'obtenir l'aide de:

UIScrollView with centered UIImageView, like Photos app

et

Center content of UIScrollView when smaller

mais n'a pas été en mesure de résoudre à l'aide de ces réponses.

+0

Je me bats aussi trouver une solution pour cela. Il semble qu'il n'y ait pas de moyen simple de centrer le contenu d'un scrollView. – Jonah

+0

A-t-il déjà reçu une réponse? – JoePasq

Répondre

1

Créer une UIView séparée et ajouter le UIImageView centré dans ce domaine, puis ajoutez la vue sur la scrollview

UIView *view = [[UIVIew alloc] initWithFrame:<frame that will fill your scrollview>]; 
CGRect frame = CGRectMake((view.size.width - IMAGE_WIDTH)/2, (view.size.height - IMAGE_HEIGHT)/2, IMAGE_WIDTH, IMAGE_HEIGHT); 
UIImageView *imageView = [[UIImageView alloc] initWithFrame:frame]; 
imageView.image = [UIImage imageNamed:@"imageSized_IMAGE_WIDTH_by_IMAGE_HEIGHT.png"]; 
[view addSubview:imageView]; 
[imageView release]; 

[scrollView addSubview:view]; 
[view release]; 

Notez que vous devez définir le cadre de la vue d'être les dimensions et l'emplacement dont vous avez besoin dans la scrollview. La partie importante à noter est le centrage de l'imageview à l'intérieur du cadre de vue en utilisant les dimensions des cadres de vue comme variables.

+0

Cela fonctionnera en quelque sorte. Le problème est que si l'image est plus petite que l'UIView, elle défilera partiellement hors de l'écran. L'application photos ne permet pas cela et il semble beaucoup plus agréable. – Jonah

+1

Oui, j'ai vu le problème dont parle Jonah dans certaines applications. La seule application que j'ai vu qui était capable de faire ce que nous voulons correctement est Photos.app d'Apple :(Jusqu'à présent, je centrais juste mon image dans un UIView qui est alors la taille d'image + les inserts dont j'ai besoin pour être centré à l'intérieur le UIScroolView n'est pas optimal, puisqu'il ajoute des barres noires en haut et en bas.Il semble un peu mieux si je supprime les barres de défilement (comme Photos.app) – runmad

4

Vous pouvez dire à la UIScrollView pour faire défiler vue spécifique en appelant scrollRectToVisible:animated:

Exemple:

[myScrollView scrollRectToVisible:imageView.frame animated:YES]; 

Pour centrer verticalement, essayez ceci:

1) Ajouter une vue vide à votre scrollview qui est la même hauteur de votre contentSize.

2) Ajoutez votre UIImageView au centre du emptyView

2) scrollRectToVisible sur cette vide vue.

+0

capture d'écran est cassé – Besi

0

contentInset ne devrait pas changer le contentSize, il devrait changer le contentOffset. Essayez le paramètre contentSize, puis le contentInset. Regardez également dans la couleur de fond de l'UIScrollView et ce qui pourrait être derrière. Je n'ai aucun problème à centrer un UIImageView dans un UIScrollView en utilisant setContentSize, setContentInset et addSubview.

1

Apple a publié les vidéos de la session 2010 de la WWDC à tous les membres du programme des développeurs iphone.L'un des sujets abordés est comment ils ont créé l'application photos !!! Ils construisent une application très similaire étape par étape et ont rendu tout le code disponible gratuitement.

Il n'utilise pas d'API privée non plus. Je ne peux pas mettre du code ici à cause de l'accord de non-divulgation, mais voici un lien vers l'exemple de téléchargement de code. Vous devrez probablement vous connecter pour avoir accès.

http://connect.apple.com/cgi-bin/WebObjects/MemberSite.woa/wa/getSoftware?code=y&source=x&bundleID=20645

Et, voici un lien vers la page WWDC iTunes:

http://insideapple.apple.com/redir/cbx-cgi.do?v=2&la=en&lc=&a=kGSol9sgPHP%2BtlWtLp%2BEP%2FnxnZarjWJglPBZRHd3oDbACudP51JNGS8KlsFgxZto9X%2BTsnqSbeUSWX0doe%2Fzv%2FN5XV55%2FomsyfRgFBysOnIVggO%2Fn2p%2BiweDK%2F%2FmsIXj

6

Ce code devrait fonctionner sur la plupart des versions d'iOS (et a été testé pour fonctionner sur 3.1 vers le haut, qui est tout ce que j'ai actuellement accès à).

Il est basé sur le code Apple WWDC mentionné dans la réponse de Jonah.

Ajouter le ci-dessous à votre sous-classe de UIScrollView et remplacer tileContainerView avec la vue contenant votre image ou de tuiles:

- (void)layoutSubviews { 
    [super layoutSubviews]; 

    // center the image as it becomes smaller than the size of the screen 
    CGSize boundsSize = self.bounds.size; 
    CGRect frameToCenter = tileContainerView.frame; 

    // center horizontally 
    if (frameToCenter.size.width < boundsSize.width) 
     frameToCenter.origin.x = (boundsSize.width - frameToCenter.size.width)/2; 
    else 
     frameToCenter.origin.x = 0; 

    // center vertically 
    if (frameToCenter.size.height < boundsSize.height) 
     frameToCenter.origin.y = (boundsSize.height - frameToCenter.size.height)/2; 
    else 
     frameToCenter.origin.y = 0; 

    tileContainerView.frame = frameToCenter; 
} 
+0

Je travaille sur une application iPad et je voulais centrer l'image Je n'ai pas sous-classé UIScrollView, à la place j'ai ajouté ce code à shouldAutorotateToInterfaceOrientation et il fonctionne maintenant bien en modes paysage et portrait. – Sushant