Есть какой-нибудь "ориентированный на основы" пример NSScroller? - PullRequest
1 голос
/ 23 июня 2009

Я ищу какой-то простой, простой пример того, как работать с парой NSScrollers в NSScrollView с пользовательским NSView.

Существуют единичные примеры, в основном состоящие из надуманных примеров, использующих программно созданные интерфейсы, или основанные на предположении, что разработчик работает с типичным ImageView или TextView. Даже пример Sketch основан на NSView, который использует параметры страницы в диалоговом окне «Печать» для границ, и все управляется Какао. Таким образом, нигде нет реальных обсуждений или примеров того, как заставить все это работать с использованием пользовательской Модели (хотя это может быть частью проблемы, потому что на чем основывается Модель?). Даже собственная документация Apple здесь хитрая.

По сути, у меня есть подклассифицированный NSView, встроенный в NSScrollView (в соответствии с Руководством по просмотру Scoll), который пользователь может щелкнуть в представлении для создания, редактирования и удаления объектов, во многом как программа для иллюстрации. Модель - это те объекты, которые являются просто обертками данных, которые просто записывают свою позицию для использования drawRect :. Высота и ширина основаны на пользовательских значениях, которые при необходимости переводятся в пиксели.

Моя проблема в том, что все примеры, которые я нашел, основаны либо на текстовом редакторе, либо на средстве просмотра изображений, либо используют стандартные размеры документов в диалоговом окне «Параметры страницы». Поскольку это общие типы документов, Cocoa в основном управляет разработчиком, поэтому код взаимодействия более или менее скрыт (или я просто не вижу его таким, какой он есть). Мой проект не соответствует ни одной из этих потребностей, и мне не нужно печатать. Вставить мою модель в свойство documentView не сработает.

Я просто ищу простой пример того, как инициализировать NSScrollers с помощью пользовательской объектно-ориентированной модели (documentView) и обрабатывать прокрутку и обновление на основе действий пользователя, например, когда пользователь перетаскивает предмет Объекты смещены влево или вниз, или размер окна изменяется. Я думаю, что я близок к тому, чтобы собрать все это вместе, но мне не хватает точки перехода, которая связывает элементы управления с документом.

(Не то, чтобы это имело значение в вопросе о Какао, но когда я делал это в REALbasic, я просто вычислял и применял MaxX, MaxY к максимальному значению ScrollBar на основе действий пользователя, следил за положением в ScrollBar, когда пользователь щелкает и рисует по мере необходимости. Кажется, NSScrollers в контексте NSScrollView не так очевидны для меня.)

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

У меня есть массив объектов, находящихся в подклассе NSDocument, которые являются держателями данных, которые сообщают drawRect, что и где рисовать. Это прямо из примера Sketch. В примере Sketch используются размеры документов в диалоговом окне «Параметры страницы», поэтому здесь нечего показывать. Я в порядке с Какао, обрабатывающим состояние полос прокрутки, но как мне связать ScrollView, чтобы увидеть первоначальное состояние редактора в NSDocument и обновления этих объектов и редактора? Должен ли я рассчитать свой собственный NSRect и передать его в NSScrollView? Где и как? Я делаю это в моем собственном NSView, который был встроен в NSScrollView или мой NSDocument в init? NSScrollView не создается программно (нет простого способа сделать это), поэтому он все сидит в Интерфейсном Разработчике, ожидая подключения. Я скучаю по битам.

Возможно, на этой неделе я надену свою кепку "Я не понимаю", но это не может быть таким трудным. Приложения для иллюстрации, MIDI-редакторы и множество других подобных пользовательских приложений делают это постоянно.

решено (в основном):

Я думаю, что я уже разобрался с этим, хотя, вероятно, это не лучшая реализация.

Мой класс документа теперь имеет свойство NSRect DocumentRect, которое просматривает все его объекты и возвращает новый NSRect на основе их местоположения. Я вызываю это в событиях мыши моего подкласса NSView с

[self setFrame:[[self EditorDocument] DocumentRect]];

Это обновляет размер представления в зависимости от взаимодействия с пользователем, и теперь окно обрабатывает прокрутку, как раньше. На данный момент я выясняю, как заставить рамку расширяться при перетаскивании, но, по крайней мере, теперь у меня есть фундаментальная концепция, которую я упустил.

Полученный ответ указал мне направление, в котором я должен был идти (для documentView требуется представление, что переводится как просмотр класса NSView), поэтому Питер получает кредит. Большое спасибо за помощь.

1 Ответ

4 голосов
/ 23 июня 2009

Представление документа - это не модель, это представление. Вот почему он называется документ view .

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

Все, что вам нужно сделать, - это сделать достаточно большой вид, чтобы показать всю модель, а затем установить его как вид документа для представления с прокруткой. Оттуда, это должно просто работать. Вам не нужно самостоятельно управлять ни одним из номеров, связанных с прокруткой; Какао обрабатывает их для вас.

Подробнее см. Руководство по программированию с прокруткой .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...