2009-09-18 22 views
5

Ich konnte die Antwort für dieses Problem, das ich habe, nicht finden.Center UIImageView innerhalb von UIScrollView ohne contentInset?

Ich habe eine UIImageView in einem UIScrollView, und ich möchte die Mitte seinen Inhalt vertikal.

Derzeit kann ich das nur tun, indem ich das contentInset der Bildlaufansicht auf die Höhe der UIImageView-Größe einstelle, aber das ist keine perfekte Lösung; es vergrößert nur die Größe des UIImageView, wodurch der UIScrollView "denkt", dass sein Inhalt größer ist, und fügt diese schwarzen Balken an die Spitze hinzu.

Ich habe versucht, von Hilfe zu erhalten:

UIScrollView with centered UIImageView, like Photos app

und

Center content of UIScrollView when smaller

aber nicht in der Lage, es zu lösen diese Antworten verwenden.

+0

ich auch ein Update für diese finden bin kämpfen. Es scheint, dass es keine einfache Möglichkeit gibt, den Inhalt einer scrollView zu zentrieren. – Jonah

+0

Wurde es schon beantwortet? – JoePasq

Antwort

1

eine separate uiview erstellen und fügen Sie die UIImageView in dieser zentriert, dann den Blick auf die

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]; 

Hinweis

Scroll hinzufügen, dass Sie die Ansicht Rahmen einstellen müssen die Abmessungen und die Position, die Sie in der sein müssen Bildlauf Der wichtige zu beachtende Teil ist die Zentrierung der Bildansicht innerhalb des Ansichtsrahmens, indem die Dimensionen der Ansichtsrahmen als Variablen verwendet werden.

+0

Das wird irgendwie funktionieren. Das Problem besteht darin, dass das Bild, wenn es kleiner als die UIView ist, teilweise vom Bildschirm abläuft. Die Fotos App erlaubt das nicht und es sieht viel schöner aus. – Jonah

+1

Ja, ich habe das Problem gesehen, über das Jonah in einigen Apps spricht. Die EINZIGE App, die ich gesehen habe, war Apples Photos.app :(Bisher habe ich nur mein Bild in einer UIView zentriert, das ist dann die Bildgröße + was immer ich brauche um es zentriert zu haben Die UIScroolView ist nicht optimal, da oben und unten schwarze Balken hinzugefügt werden Sieht etwas besser aus wenn ich die Scrollbalken entferne (wie Photos.app) – runmad

4

Sie können die UIScrollView sagen, bestimmte Ansicht zu scrollen durch den Aufruf scrollRectToVisible:animated:

Beispiel:

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

Um es vertikal zentriert, versuchen Sie dies:

1) Fügen Sie einen leeren Blick auf Ihre scrollview, das die selbe Höhe von contentSize hat.

2) Fügen Sie Ihre UIImageView zum Zentrum des emptyView

2) scrollRectToVisible auf dieser leer Ansicht.

+0

screenshot is broken – Besi

0

contentInset sollte die contentSize nicht ändern, es sollte den contentOffset ändern.

Versuchen Sie, die contentSize und dann contentInset zu setzen. Schauen Sie auch in die Hintergrundfarbe der UIScrollView und was dahintersteckt. Ich habe keine Probleme, eine UIImageView in einer UIScrollView mit setContentSize, setContentInset und addSubview zu zentrieren.

1

Apple hat die 2010 WWDC Session Videos an alle Mitglieder des iphone Entwicklerprogramms freigegeben.Eines der diskutierten Themen ist, wie sie die Fotos App erstellt haben !!! Sie bauen Schritt für Schritt eine sehr ähnliche App auf und haben den gesamten Code kostenlos zur Verfügung gestellt.

Es verwendet auch keine private API. Ich kann den Code wegen der Geheimhaltungsvereinbarung hier nicht angeben, aber hier ist ein Link zum Download des Beispielcodes. Sie werden sich wahrscheinlich einloggen müssen, um Zugang zu erhalten.

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

Und hier ein Link zum iTunes WWDC Seite lautet:

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

Dieser Code auf den meisten Versionen von iOS funktionieren sollte (und getestet wurde nach oben auf 3.1 zu arbeiten, Das ist alles, was ich gerade habe).

Es basiert auf dem Apple WWDC-Code, der in Jonahs Antwort erwähnt wird.

die unten an der Unterklasse von UIScrollView hinzufügen und ersetzen tileContainerView mit der Ansicht Ihr Bild oder Fliesen enthalten:

- (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

Ich arbeite an einer iPad App und wollte das Bild zentrieren Ich habe UIScrollView nicht abgeleitet, stattdessen habe ich diesen Code zu shouldAutorotateToInterfaceOrientation hinzugefügt und funktioniert jetzt sowohl im Quer- als auch im Hochformat. – Sushant

Verwandte Themen