UIScrollView не використовує обмеження авторозкладки


78

У мене є вид прокрутки та перегляд зображення за ним, і я заповнюю його пером. Я використовую авторозкладку. У мене є нижній простір для суперперегляду та верхній простір для суперперегляду на обох переглядах. Перегляд зображення робить саме те, що я хочу. Для iphone 5 це де я хочу. А для інших iphone він залишається над нижньою частиною екрана, тому він правильно змінює розмір. Вигляд прокрутки виглядає прямо на iphone 5, але на інших телефонах його розмір не змінюється, тому він прокручується вниз під видом програми. Я отримую ці повідомлення в журналі:

 2012-11-21 10:42:38.576 LCHApp[12604:907] Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want. 
  Try this: (1) look at each constraint and try to figure out which you don't expect;
  (2) find the code that added the unwanted constraint or constraints and fix it.
 (Note: If you're seeing NSAutoresizingMaskLayoutConstraints that you don't understand, refer
  to the documentation for the UIView property translatesAutoresizingMaskIntoConstraints) 

"<NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom == UIImageView:0x1d892110.bottom>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cca10 h=-&- v=-&- ScheduleViewNib:0x1d853630.height == UIScrollView:0x1d8413b0.height - 386>",
"<NSLayoutConstraint:0x1d8e5340 V:[UIImageView:0x1d892110]-(64)-|   (Names: '|':ScheduleView:0x1d8efc30 )>",
"<NSAutoresizingMaskLayoutConstraint:0x1d8cf520 h=--& v=--& V:[ScheduleView:0x1d8efc30(480)]>",
"<NSLayoutConstraint:0x1d8eaed0 V:|-(45)-[UIScrollView:0x1d8413b0]   (Names: '|':ScheduleView:0x1d8efc30 )>"


 Will attempt to recover by breaking constraint 
 <NSLayoutConstraint:0x1d8ea080 UIScrollView:0x1d8413b0.bottom ==      UIImageView:0x1d892110.bottom>

Я вже пробував

[self setTranslatesAutoresizingMaskIntoConstraints:YES];

і

[self.myScrollView setTranslatesAutoresizingMaskIntoConstraints:YES];

З того, що я бачу, це просто знімає всі обмеження з поглядів. І це не те, що я хочу.


2
Технічна примітка Apple TN2154: UIScrollView And Autolayout дуже детально висвітлює цю проблему.
smileyborg

Відповіді:


177

Взаємозв'язок між UIScrollView та автоматичним макетом відрізняється від інших аспектів автоматичного макетування. В основному, якби дозволялося працювати з простим автоматичним макетом, нічого б не прокручувалось. Наприклад, якби підпогляд вигляду прокрутки був закріплений звичайним чином обмеженням до 10 пунктів від верхнього перегляду прокрутки, він би там був закріплений абсолютно; він ніколи не рухався б, як би не прокручувався вид прокрутки.

Щоб вирішити цю проблему, UIScrollView, який використовує авторозкладку, працює абсолютно по-новому. Тому, коли ви говорите "Я використовую авторозкладку", ви повинні підготуватися до того, щоб речі діяли зовсім інакше, ніж раніше. Ви повинні або використовувати один підпрогляд прокрутки translatesAutoresizingMaskIntoConstraints = YES, і явний розмір вмісту, або все, що має бути, translatesAutoresizingMaskIntoConstraints = NOі розмір вмісту буде визначено неявно на основі обмежень підпроектів.

Це дуже добре пояснено в https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html


5
Вас може зацікавити це питання: stackoverflow.com/questions/14307037/… (не в останню чергу завдяки нагороді!) Я думаю, що це проблема прокрутки / авторозкладки, але, на мій погляд, це читається як помилка - у цьому випадку прокрутка view - це подання таблиці, і розмір вмісту не регулюється належним чином під час обертання.
jrturton

3
@matt Я не знаю, чи бачили ви таку поведінку, але якщо ви використовуєте лише обмеження макета для визначення розміру вмісту прокрутки, виникає помилка: прокрутіть зміщення змісту від (0, 0) перейдіть на іншу вкладку або модальний контролер перегляду, поверніться, і підпрогляди подання прокрутки зміщуються зміщенням вмісту, і ви не можете повернутися назад. Буду вдячний, якщо ви підтвердите це і обдурите
edelaney05

3
@ edelaney05 Я думаю, що можу підтвердити помилку, але перед тим, як подати заявку в Apple, слід зробити демо-проект, особливо. оскільки скопіюйте та вставте код у openradar.appspot.com/radar?id=2932404 навіть не компілюється (ви constraintsWithVisualFormat:options:metrics:views:неправильно ввели ім'я ). Завжди використовуйте реальний код, який насправді працює. І крім того, у реальний проект ви можете включити фактичне зображення. Люди Apple не мають уяви і часу; ви повинні зробити за них всю роботу заздалегідь.
matt

3
@ edelaney05 "плечова присвячена панчетта" ???? :) ОК добре. Я насправді зробив це набагато уважніше, базуючись на їх коді, з переглядом зображення, розміром до великого. Надавши вигляду прокрутки червоний колір тла, а також увійшовши в журнал, було дуже ясно, що вигляд прокрутки вважає, що все правильно (розмір вмісту, зміщення вмісту), але малює вигляд зображення не в тому місці, тобто компенсується на суму вмісту, зміщеного з того часу, коли ми залишили представлення.
matt

2
@matt baconipsum.com ! :-) Чудово. Точно така ж поведінка, яку я бачив. Перегляд прокрутки повідомляв про все як про "нормальний", але малювання було неправильним через коефіцієнт зміщення. Дякую, що підтвердили, що я не божевільний (але, лише стосовно цієї помилки!).
edelaney05

162

Дуже важливо при використанні автоматичного макетування: ви повинні закріпити праворуч та / або нижню частину останнього підпрогляду праворуч та / або внизу вікна прокрутки. Ось як режим прокрутки знає розмір вмісту. Наприклад:

[scrollView addConstraint:[NSLayoutConstraint constraintWithItem:lastSubView
                                                 attribute:NSLayoutAttributeRight
                                                 relatedBy:NSLayoutRelationEqual
                                                    toItem:scrollView
                                                 attribute:NSLayoutAttributeRight
                                                multiplier:1.0
                                                  constant:0]];

Дякую цьому веб-сайту за подання чудового прикладу.

Я втратив години через це, і я сподіваюсь пощадити інших свій біль.


4
Це ідеально. Я шукав простий приклад, такий як у посиланні. Дякую!!!
pgpb.padilla

Незважаючи на те, що відповідь
Метта

22
@dmur "Хоча відповідь Метта хороша, ця набагато практичніша" - Чувак, це теж моя відповідь. Він отримав код / ​​пояснення з моєї книги! Радий, що зміг допомогти двічі. :)))
matt

Залежно від того, як ви розмістите свій scrollView та їхні підпрограми, можливо, вам доведеться закріпити свої матеріали ліворуч або зверху. У моєму випадку мені довелося закріпити все ліворуч.
ArtSabintsev

Ви також можете додати обмеження за допомогою Interface Builder. Чудова відповідь!
Moisés Olmedo

0

Щоб UIScrollviews працював добре з обмеженнями, я використовую цей підхід, на який відповіли тут . У цій відповіді я розглядаю питання, як отримати вертикально прокручуваний прокручувальний перегляд, який також працює з обертанням пристрою. Ви також можете налаштувати підхід для роботи з горизонтально прокручуваними переглядами прокрутки. Для переглядів прокрутки, які прокручуються в обох напрямках, не додайте фокус обмеження ширини, що відповідає розміру. Але все інше робіть так само.


-3

Пару речей.

  1. переконайтеся, що ввімкнено авторозкладку (IB на вкладці "Інспектор файлів")
  2. Переконайтеся, що НЕ вносите жодних змін, що стосуються меж, кадру тощо - це все робиться за допомогою автоматичних обмежень
  3. Обов’язково тримайтеся подалі від AutoResizingMask. Це буде конкурувати з новими налаштуваннями. Якщо це зроблено правильно, тепер ви можете розташувати свою кнопку, і вона буде чудово працювати. Ось як.

Ця помилка свідчить про те, що ваш перо або елемент керування в ньому не використовують автоматичну розкладку.


1
Але UIScrollView особливий, і ваша відповідь не враховує цього факту.
matt
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.