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