2015-01-23 10 views
6

Zamierzamy opracować projekt w ios, więc uczę się układu automatycznego z przewijaniem, działa dobrze, gdy dodałem jeden obraz, kiedy jestem Próbując dodać więcej niż jeden obraz, dostałem bardzo dziwną rzecz, że pierwszy obraz został rozciągnięty i nałożony na następny obraz. Oto mój kodFunkcja UIScrollView nie działa programowo w programie Autolayout (przy użyciu więcej niż jednego obrazu)

UIScrollView *scrollView = [[UIScrollView alloc] init]; 
UIImageView *imageView = [[UIImageView alloc] init]; 
[imageView setImage:[UIImage imageNamed:@"2.png"]]; 

UIImageView *imageView1 = [[UIImageView alloc] init]; 
[imageView1 setImage:[UIImage imageNamed:@"01.png"]]; 
[self.view addSubview:scrollView]; 

[scrollView addSubview:imageView1]; 
[scrollView addSubview:imageView]; 

scrollView.translatesAutoresizingMaskIntoConstraints = NO; 
imageView.translatesAutoresizingMaskIntoConstraints = NO; 
imageView1.translatesAutoresizingMaskIntoConstraints = NO; 

self.imageViewPointer = imageView; 
self.imageViewPointer = imageView1; 
scrollView.maximumZoomScale = 2; 
scrollView.minimumZoomScale = .5; 
scrollView.delegate = self; 

NSDictionary *viewsDictionary = NSDictionaryOfVariableBindings(scrollView,imageView,imageView1); 
NSLog(@"Current views dictionary: %@", viewsDictionary); 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-20-[imageView]|" options:0 metrics: 0 views:viewsDictionary]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-415-[imageView]|" options:0 
                    metrics: 0 views:viewsDictionary]]; 

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView1]-20-|" options:0 metrics: 0 views:viewsDictionary]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView1]-150-|" options:0 metrics: 0 views:viewsDictionary]]; 

i otrzymałem wynik !!!

enter image description here

+0

To działa, ale nie jest to łatwe do konfiguracji ograniczeń. Tutaj masz zduplikowany temat, w którym wiele osób opisuje, w jaki sposób poradzili sobie z tym problemem: http://stackoverflow.com/questions/20223021/i-am-officially-too-stupid-for-uiscrollview-with-autolayout – KlimczakM

+0

I zdecydowanie zaleca się korzystanie z biblioteki PureLayout: https://github.com/smileyborg/PureLayout –

+0

dzięki za odpowiedź, przepraszam, zapomniałem powiedzieć "szukam go programowo". – nisar

Odpowiedz

3

Wielkość obszaru przewijalnej Twojego Scrollview zostanie ustawiony przez ograniczenia jego subviews.

Masz 2 ograniczeń, które mogą być wykorzystane, aby określić wysokość obszaru przewijalnej:

  1. "V:|-415-[imageView]|"

    Mówi Auto Layout, aby umieścić obraz 415 punktów od szczytu jej SuperView i umieścić 0 punktów od dołu jego superwizji. Nie określa wysokości, ale Auto Layout użyje wysokości obrazu zawartego w obrazie, nie mając żadnych innych ograniczeń. Zauważ, że obraz może być rozciągnięty, jeśli jest to konieczne, aby spełnić inne ograniczenia.

  2. "V:|[imageView1]-150-|"

    Mówi Auto Layout umieścić na swoim dysku 0 punktów od szczytu jej SuperView i 150 punktów od dołu jej SuperView. Nie określa wysokości. Z tego powodu Auto Layout może rozciągnąć jeden z obrazów, aby spełnić oba ograniczenia.

Zamiast tego należy podać informacje o rozmieszczeniu obrazów względem siebie. Na przykład:

"V:|-20-[imageView1]-20-[imageView]-20-|"

Jeśli dodajesz te obrazy jeden na raz, nie trzeba określić to w jednym czasie. Można dodać ograniczenia tak:

"V:|-20-[imageView1]"

"imageView1 jest 20 punktów od szczytu SuperView"

"V:[imageView1]-20-[imageView]"

"ImageView jest 20 punktów poniżej imageView1"

"V:[imageView]-20-|"

"imageView to 20 punktów od bota tom of the view "

Po powiązaniu wszystkich widoków ze sobą oraz na górze i na dole scrollView, Auto Layout będzie w stanie obliczyć wysokość scrollView.


Będziesz mieć podobny problem ze swoimi szerokościami. Masz ograniczone zarówno z obrazów na obu stronach Superview:

"H:|-20-[imageView]|"
"H:|[imageView1]-20-|"

Z tego powodu, Auto Układ potrwają jeden ze swoich obrazów w celu spełnienia ograniczeń. Do określenia szerokości scrollView należy użyć tylko najszerszego obrazu. Wszystkie pozostałe powinny być ograniczone tylko do lewej krawędzi superwizja i pozostawić ciągnącym się przed sobą |.

Ponownie, jeśli dodajesz te obrazy jeden po drugim i nie wiesz, co jest najszersze, dopóki nie dodasz ich wszystkich, śledź najszersze widziane do tej pory i ograniczaj tylko obrazy do lewej krawędzi. Potem, kiedy skończysz, dodać ograniczenie ustawić szerokość swojego obszaru przewijania oparciu najszerszego widzenia:

"H:|-20-[imageView]-20-|"

+0

tak, teraz mam coś o autolayout, dziękuję. – nisar

0

Co dokładnie chcesz osiągnąć? Jeśli chcesz mieć listę obrazów, powinieneś użyć UITableView. Ale tak czy inaczej, Twój kod będzie wyglądał mniej więcej tak:

[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]]; 
[self.view addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[scrollView]|" options:0 metrics: 0 views:viewsDictionary]]; 

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView]|" options:0 metrics: 0 views:viewsDictionary]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-415-[imageView]" options:0 
                    metrics: 0 views:viewsDictionary]]; 

[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|[imageView1]|" options:0 metrics: 0 views:viewsDictionary]]; 
[scrollView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|[imageView1]" options:0 metrics: 0 views:viewsDictionary]]; 
+0

Robię to dla nauki podstaw w ios, muszę nauczyć się automatycznego układu dla komponentów interfejsu użytkownika (jak przycisk, obraz, ...). Ale po prostu wypróbowałem to z obrazem i otrzymałem dziwne wyniki. Potrzebuję przyczyny, dla której pierwszy obraz został nałożony na drugi. dzięki za odpowiedź .. – nisar

+0

Układ jest renderowany w sposób w jaki napisałeś kod. Sprawdź kod (stałe AutoLayout). –

Powiązane problemy