2015-01-23 3 views
6

Мы собираемся разработать проект в ios, так что я изучаю автоматический макет с scrollview, он отлично работает, когда я добавил одно изображение, Когда я пытаясь добавить несколько изображений, мне стало очень странно, что первое изображение было растянуто долго и перекрывалось с помощью следующего следующего изображения. Вот мой кодUIScrollView не работает с автоопределением программно (с использованием нескольких изображений)

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

и у меня есть выход !!!

enter image description here

+0

Это работает, но это не так легко установить ограничения. Здесь у вас есть повторяющаяся тема, в которой многие люди описывают, как они справились с этой проблемой: http://stackoverflow.com/questions/20223021/i-am-officially-too-stupid-for-uiscrollview-with-autolayout – KlimczakM

+0

I настоятельно рекомендую вам использовать библиотеку PureLayout: https://github.com/smileyborg/PureLayout –

+0

благодарит за ваш ответ, Извините, что забыл сказать «Я смотрю это программно». – nisar

ответ

3

Размер прокруткой вашего Scrollview будут установлены ограничения его подвидов.

У вас есть 2 ограничения, которые могут быть использованы для определения высоты прокрутки:

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

    Это говорит Auto Layout, чтобы разместить изображение 415 очков из верхней части его надтаблицы и поставить 0 пунктов со дна своего супервизора. Он не определяет высоту, но Auto Layout будет использовать высоту изображения, содержащегося в imageView, без каких-либо других ограничений. Обратите внимание, что изображениеView может растягиваться, если необходимо, для удовлетворения других ограничений.

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

    Это говорит Auto Layout, чтобы разместить ваше изображение 0 баллов из верхней части его надтаблицы и 150 точек со дна его надтаблицы. Он не определяет высоту. Из-за этого Auto Layout может растянуть одно из изображений, чтобы удовлетворить оба ограничения.

Вместо этого вы должны предоставить информацию о том, как изображения расположены на расстоянии друг от друга. Например:

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

Если вы добавляете эти образы один за один раз, вы не должны указать это в одно время. Вы можете добавить ограничения, как это:

"V:|-20-[imageView1]"

"imageView1 20 баллов из верхней части надтаблицы"

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

"ImageView составляет 20 пунктов ниже imageView1"

"V:[imageView]-20-|"

"imageView - 20 баллов от бота том супервизора "

Когда вы ограничили все виды изображений друг к другу и в верхней и нижней частях scrollView, Auto Layout сможет вычислять высоту scrollView.


У вас будет аналогичная проблема с вашей шириной. Вы ограничены оба ваших изображений с обеих сторон SuperView:

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

Из-за этого, Auto Layout будет растягиваться одно из изображений, чтобы соответствовать ограничениям. Для указания ширины scrollView должно использоваться только ваше самое широкое изображение. Все остальные должны ограничиваться только левым краем надзора и опускать конец |.

Опять же, если вы добавляете эти изображения по одному, и вы не знаете, что такое самое широкое, пока вы их не добавили, следите за самым широким, который вы видели до сих пор, и ограничиваете только изображения к левому краю. Затем, когда вы закончите, добавьте ограничение, чтобы установить ширину вашей области прокрутки, основанную на широком зрения:

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

+0

да, теперь я получил что-то об автозапуске, спасибо. – nisar

0

Что именно вы хотите достичь? Если вы хотите иметь список изображений, вы должны использовать UITableView. Но в любом случае, ваш код будет выглядеть следующим образом:

[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

Я делаю это для изучения основ в ios, мне нужно изучить автомат для компонентов ui (например, кнопку, изображение, ...), но я просто попробовал это с изображением, и я получил странный результат. Мне нужно, почему первое изображение было перекрыто вторым. спасибо за ваш ответ .. – nisar

+0

Макет визуализируется так, как вы написали код. Проверьте код (константы AutoLayout). –

Смежные вопросы