Проблемы с автоматической компоновкой macOS 10.12

#macos-sierra

#macos-sierra

Вопрос:

В 10.12 есть несколько огромных изменений, но, на мой взгляд, самым большим является новая система автоматической компоновки (или модифицированная / переписанная старая… кто знает). Я подготовил простой проект, чтобы продемонстрировать проблему. Это связано со свертыванием элемента разделенного представления с помощью кнопки. Это происходит только на 10.12. Все, что вам нужно сделать, это скомпилировать проект и нажать кнопку. Появится сообщение об ошибке:

2016-10-04 15:10:28.284296 тест-12 [64932:7425277] [Макет] Обнаружены недостающие ограничения для . Он не может быть размещен, поскольку недостаточно ограничений для полного определения размера и происхождения. Добавьте недостающие ограничения или установите translatesAutoresizingMaskIntoConstraints=YES, и для вас будут созданы ограничения. Если это представление создается вручную в macOS 10.12 и более поздних версиях, вы можете не вызывать [super layout] из переопределения. Установите точку останова для DETECTED_MISSING_CONSTRAINTS для отладки. Эта ошибка будет зарегистрирована только один раз.

После установки точки останова мы можем обнаружить, что проблемный вид:

 (lldb) po $arg1
<NSSplitDividerView: 0x618000161980>
  

Я полностью ошибаюсь или есть определенная проблема с 10.12? И, пожалуйста, посоветуйте, как по возможности предотвратить ошибки такого типа.

Проект можно загрузить с github

Еще раз спасибо за помощь.

И. Николов

Комментарии:

1. Я могу вызвать это сообщение, просто вызвав NSAlert.layout(), чтобы заставить оповещение немедленно выложиться. Поскольку в этом случае ни одно из предложений не работает, и нет очевидного способа избежать ошибки, я отправил радар (rdar: // 28700495).

2. Я исправляю эту проблему, возвращаясь false из splitView(_ splitView: NSSplitView, shouldHideDividerAt dividerIndex: Int) -> Bool в my NSSplitViewController .

3. @LShi: Спасибо, у меня была такая же проблема, и у меня это тоже сработало.

4. @LShi Вы должны опубликовать свое исправление в качестве ответа. У меня это сработало.

5. Привет, в настоящее время я не использую этот «хак» в своем проекте, и ошибок больше нет. Какая у вас версия macOS? У меня 10.13. Когда это происходит? При запуске или при переключении splitviewitem / боковой панели?

Ответ №1:

У меня такая же проблема с автоматической компоновкой, и я нашел обходной путь для своего проекта. После добавления вложенного представления с его ограничениями я вызываю окно в «макет». К сожалению, я делаю это после каждого вызова «добавить», иначе система снова выдаст уродливое сообщение. Это работает для меня, и я просто вызываю его во время инициализации.

   // Left Split View
  [self.scrollviewMain setTranslatesAutoresizingMaskIntoConstraints:NO];
  [self.viewMainLeft addSubview:self.scrollviewMain];
  [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]];
  [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeTop    relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeTop    multiplier:1.0 constant:-l_floatConstant]];
  [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeLeft   relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeLeft   multiplier:1.0 constant:-l_floatConstant]];
  [self.viewMainLeft addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainLeft attribute:NSLayoutAttributeRight  relatedBy:NSLayoutRelationEqual toItem:self.scrollviewMain attribute:NSLayoutAttributeRight  multiplier:1.0 constant:l_floatConstant]];
  [self.windowMain layoutIfNeeded];
  // Right Split View
  [self.scrollviewDetails setTranslatesAutoresizingMaskIntoConstraints:NO];
  [self.viewMainRight addSubview:self.scrollviewDetails];
  [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeBottom relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeBottom multiplier:1.0 constant:l_floatConstant]];
  [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeTop    relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeTop    multiplier:1.0 constant:-l_floatConstant-1]];
  [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeLeft   relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeLeft   multiplier:1.0 constant:-l_floatConstant]];
  [self.viewMainRight addConstraint:[NSLayoutConstraint constraintWithItem:self.viewMainRight attribute:NSLayoutAttributeRight  relatedBy:NSLayoutRelationEqual toItem:self.scrollviewDetails attribute:NSLayoutAttributeRight  multiplier:1.0 constant:l_floatConstant]];
  [self.windowMain layoutIfNeeded];
  

Комментарии:

1. Но… вы должны согласиться, что это неправильный способ создания макета… Определенно что-то не так … или, по крайней мере, неправильно истолковано. В любом случае — спасибо за информацию. Существует несколько таких обходных путей, которые, на мой взгляд, не являются ни эффективными, ни сложными. Будем надеяться, что в будущем все изменится или мы получим больше информации о том, как предотвратить подобные ситуации.