UIScrollView не использует ограничения автоопределения

У меня есть вид прокрутки и изображение позади него, и я заполняю его перьями. Я использую автозапуск. У меня есть нижнее пространство для просмотра и верхнее пространство для просмотра обоим представлениям. Представление изображения делает именно то, что я хочу, чтобы он делал. Для iphone 5 я хочу это. И для других iphones он остается выше нижней части экрана, поэтому он правильно изменяется. Вид прокрутки выглядит прямо на 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];

Из того, что я вижу, это просто снимает все ограничения из представлений. И не то, что я хочу.

Ответ 1

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

Чтобы решить эту проблему, UIScrollView, который использует autolayout, работает совершенно по-новому. Поэтому, когда вы говорите: "Я использую автозапуск", вы должны подготовиться к тому, чтобы вещи работали совсем по-другому. Вы должны либо использовать под просмотр с одним прокруткой с translatesAutoresizingMaskIntoConstraints = YES, либо с явным размером содержимого, либо все должно иметь translatesAutoresizingMaskIntoConstraints = NO, а размер содержимого будет выводиться неявно на основе ограничений подзаголовков.

Это очень хорошо объяснено в https://developer.apple.com/library/content/releasenotes/General/RN-iOSSDK-6_0/index.html

Ответ 2

Очень важно при использовании автоматической компоновки: вы должны выровнять правую и/или нижнюю части последнего подсмотра вправо и/или в нижней части прокрутки. Это представление прокрутки знает размер содержимого. Например:

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

Спасибо за этот сайт за прекрасный пример.

Я потерял время из-за этого, и я надеюсь избавить других от моей боли.

Ответ 3

Чтобы получить UIScrollviews, чтобы хорошо работать с ограничениями, я использую этот подход для ответа здесь. В этом ответе я рассмотрю, как получить прокрутку прокрутки по вертикали, которая также работает с вращением устройства. Вы можете настроить подход к работе с прокруткой scrollviews горизонтально. Для прокрутки, которые прокручиваются в обоих направлениях, не добавить трюк ограничения ширины ширины. Но сделайте все остальное тем же.

Ответ 4

Несколько вещей.

  • убедитесь, что включено автозапуск (IB на вкладке "Инспектор файлов" )
  • Убедитесь, что вы НЕ вносите никаких изменений, связанных с границами, фреймом и т.д. - все это делается с помощью ограничений Auto теперь
  • Убедитесь, что вы держитесь подальше от AutoResizingMask. Это будет соответствовать вашим новым настройкам. Если все сделано правильно, теперь вы можете разместить свою кнопку, и она будет работать отлично. Вот как.

В этой ошибке указано, что ни ваш ниб, ни элемент управления внутри этого элемента не используют автоматическую компоновку.