2009-09-18 10 views
5

Nie mogłem znaleźć odpowiedzi na ten problem, który mam.Center UIImageView inside UIScrollView without contentInset?

Mam UIImageView wewnątrz UIScrollView, i chciałbym centrum jego zawartość pionowo.

W tej chwili jedyny sposób, w jaki mogłem to zrobić, to ustawienie ustawienia contentInset widoku przewijania na podstawie wysokości rozmiaru UIImageView, ale nie jest to idealne rozwiązanie; po prostu zwiększa rozmiar UIImageView, sprawiając, że UIScrollView "myśli", że jego zawartość jest większa i dodaje te czarne paski do góry.

Próbowałem uzyskać pomoc od:

UIScrollView with centered UIImageView, like Photos app

i

Center content of UIScrollView when smaller

Ale nie były w stanie rozwiązać go za pomocą tych odpowiedzi.

+0

jestem również stara się znaleźć rozwiązanie tego. Wygląda na to, że nie ma prostego sposobu na wyśrodkowanie zawartości scrollView. – Jonah

+0

Czy już udzielono odpowiedzi? – JoePasq

Odpowiedz

1

Utwórz osobny UIView i dodać UIImageView skoncentrowany na tym, następnie dodać widok do 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]; 

Należy pamiętać, że trzeba będzie ustawić ramkę widoku za wymiary i położenie trzeba w scrollview. Ważną rzeczą, na którą warto zwrócić uwagę, jest centrowanie widoku obrazu wewnątrz ramki widoku przy użyciu wymiarów ramek widoku jako zmiennych.

+0

To będzie działać. Problem polega na tym, że jeśli obraz jest mniejszy niż UIView, przewinie on częściowo ekran. Aplikacja do zdjęć nie pozwala na to i wygląda znacznie ładniej. – Jonah

+1

Tak, widziałem problem, o którym Jonah mówi w niektórych aplikacjach. TYLKO aplikacja, którą widziałem, była w stanie zrobić to, co chcemy właściwie to Apple's Photos.app :(Póki co, właśnie wycentrowuję obraz wewnątrz UIView, to jest rozmiar obrazu + wszelkie wstawki, które muszę mieć, aby były wyśrodkowane wewnątrz UIScroolView - nieoptymalny, ponieważ dodaje czarne pasy na górze i na dole Wygląda trochę lepiej, gdy usuwam paski przewijania (takie jak Photos.app) – runmad

4

Można powiedzieć UIScrollView, aby przejść do określonego widoku poprzez wywołanie scrollRectToVisible:animated:

Przykład:

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

Aby wyśrodkować go pionowo, spróbuj tego:

1) Dodaj pusty widok do listy scrollview o tej samej wysokości co contentSize.

2) Dodaj swój UIImageView do centrum emptyView

2) scrollRectToVisible na tej pustym widzenia.

+0

zrzuty ekranu są zepsute – Besi

0

contentInstalacja nie powinna zmieniać rozmiaru treści, powinna zmienić contentOffset.

Spróbuj ustawić contentSize, a następnie contentInset. Spójrz także na kolor tła UIScrollView i tego, co może być wyświetlane za nim. Nie mam problemu z centrowaniem UIImageView w UIScrollView przy użyciu setContentSize, setContentInset i addSubview.

1

Firma Apple opublikowała filmy z sesji WWDC 2010 dla wszystkich członków programu dla programistów iPhone'a.Jednym z omawianych tematów jest to, jak stworzyli aplikację zdjęć !!! Zbudowali bardzo podobną aplikację krok po kroku i udostępnili cały kod za darmo.

Nie korzysta również z prywatnych api. Nie mogę tu umieścić żadnego kodu z powodu umowy o nieujawnianiu, ale tutaj jest link do pobierania przykładowego kodu. Prawdopodobnie będziesz musiał się zalogować, aby uzyskać dostęp.

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

A tu jest link do strony iTunes WWDC:

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

Kod ten powinien działać na większości wersji iOS (i został przetestowany do pracy na 3,1 w górę, to jest wszystko, do czego obecnie mam dostęp).

Jest oparty na kodzie WWDC Apple wspomnianym w odpowiedzi Jonasza.

Dodaj poniżej do podklasy UIScrollView i zastąpić tileContainerView z widoku zawierającego zdjęcie lub płytek:

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

Pracuję nad aplikacją na iPada i chcę wyśrodkować obraz wyświetlane w widoku szczegółowym.Nie podklasę UIScrollView, zamiast dodać ten kod do shouldAutorotateToInterfaceOrientation i teraz działa dobrze zarówno w trybach krajobrazu i portretu. Dzięki za udostępnianie. – Sushant