Приложение на основе NSSplitViewController почти никогда не запускается с правильным размером

У меня есть это приложение, которое использует NSSplitViewController как корень и имеет NSTabViewController связано как его detailViewController.

Это приложение настроено на запуск в разрешении 1024х768. Левая панель должна запускаться с разрешением 320x768, а правая панель (где находится tabViewController) - с разрешением 704x768.

Из 10 раз я запускаю это приложение, 9 раз оно запустится с неправильным размером (около 500х500). Другая странная вещь заключается в том, что это приложение не должно масштабироваться, но если вы наведете указатель мыши на границу окна, вы увидите указатель курсора в масштабе.

Я хочу, чтобы это запускалось в правильном размере и не имело масштабируемой опции.

Обе эти настройки находятся в конструкторе интерфейсов, но игнорируются.

Вы можете скачать пример проекта, который демонстрирует проблему, здесь. Остановите и запустите проект несколько раз, чтобы увидеть проблему.

Как мне это решить?

2 ответа

Решение

Я не могу точно сказать, что является причиной проблемы, но один из способов решить ее - добавить некоторые ограничения. Интерфейсный Разработчик не позволяет вам ограничивать экземпляры NSView по умолчанию, которые он вставляет в левую и правую панели разделенного представления, поэтому вам нужно добавить свой собственный. Снимок экрана ниже взят из вашей демонстрации, но после того, как я сделал следующее:

  1. Добавил подпредставление к левому разделению (My Content View) и прикрепил его края к краям своего суперпредставления (представление Xcode автоматически добавляет к splitview)
  2. Добавил явное ограничение ширины 320 пикселей в My Content View

Когда я загружаю приложение, оба разделения видны, разделитель не сдвигается, и окно не может быть изменено.

Обновление - лучшее решение

Хотя ограничения являются одним из способов решения этой проблемы, я думаю, что корень проблемы лежит в неожиданном поведении в Интерфейсном Разработчике. Когда вы перетаскиваете NSSplitViewController объект на холст, и сделать его целью контроллера окна content window отношения, контроллер разделенного вида view розетка на самом деле не установлена. Одним из следствий этого, как представляется, является то, что при загрузке приложения разделитель будет отображаться прямо на одной стороне. Чтобы решить эту проблему, установите выход вышеупомянутого представления, чтобы указать на разделенное представление:

Я создал демонстрационный проект с настройкой, аналогичной настройке демо-приложения спрашивающего.

Для справки, та же проблема возникает, если содержимое окна указывает на NSTabViewController сцена. Новые окна открываются с размером 500х500.

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

Вот что я сделал в деталях:

  1. Добавлен новый вид контроллера сцены в раскадровку
  2. Сделал тот вид, размер которого я хочу, чтобы мое окно использовалось изначально
  3. Добавлен вид контейнера в новую сцену контроллера представления и добавлено 4 ограничения, чтобы контейнер полностью покрывал вид
  4. Подключил содержимое окна к новому контроллеру представления
  5. Наконец, подключите вид контейнера к моей реальной сцене контроллера представления вкладок

До:

[Window Controller Scene] → [Tab View Controller]

После:

[Window Controller Scene] → [View Controller Scene] → [Tab View Controller]
                             (with Container View)
Другие вопросы по тегам