Позволяющие пользователи управляют маркерами

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

Перемещение маркеров

Когда пользователь нажимает кнопку мыши по маркеру линейки, NSRulerView отправляет маркер a trackMouse:adding: сообщение. Если маркер не подвижен, этот метод ничего не делает и сразу возвращается NO. Если это подвижно, то это отправляет клиенту ряд сообщений, позволяющих его определить, как пользователь может переместить маркер на линейке.

Первое из этих сообщений rulerView:shouldMoveMarker, который позволяет клиентскому представлению препятствовать тому, чтобы был перемещен иначе подвижный маркер. Обычно, ли маркер может быть перемещен, должен быть установлен на самом маркере, но существуют ситуации, такой как, где элементы могут быть заблокированы на месте, где это более должным образом прослежено клиентским представлением вместо этого. Если возвращается клиентское представление YES, разрешение перемещения, тогда это получает серию rulerView:willMoveMarker:toLocation: сообщения как пользователь перетаскивают маркер вокруг. Каждое сообщение идентифицирует перемещаемый маркер и его предложенное новое расположение в клиентскую систему координат представления. Клиентское представление может возвратить измененное расположение, чтобы ограничить перемещение маркера или обновить его дисплей для отражения нового расположения. Наконец, когда разъединения абонентом кнопка мыши, клиент получает rulerView:didMoveMarker:, о котором это может обновить свое состояние и очистить любую информацию, это, возможно, использовало при отслеживании перемещений маркера.

Удаление маркеров

Удаление маркеров обрабатывается подобным набором сообщений. Однако они всегда отправляются во время работы перемещения, поскольку пользователь должен сначала перетаскивать маркер в линейке, чтобы быть в состоянии перетащить ее от линейки. Если маркер не установлен быть съемным, пользователь просто не может перетащить его прочь. Если маркер является съемным, то, когда пользователь перетаскивает мышь достаточно далеко далеко от базовой линии линейки, это отправляет клиентское представление a rulerView:shouldRemoveMarker: сообщение, позволяя клиенту утвердить или наложить вето на удаление. Никакие сообщения не необходимы для новых расположений, конечно, но если пользователь возвращает маркер линейке тогда, это продолжает отправлять rulerView:willMoveMarker:toLocation: сообщения как прежде. Если разъединения абонентом мышь с маркером, вырванным с линейки, маркер отправляет клиентское представление a rulerView:didRemoveMarker: сообщение, таким образом, пользователь может удалить элемент или атрибут, представленный маркером.

Добавление маркеров

Когда пользователь хочет добавить маркер, дополнение должно инициироваться приложением, конечно, так как нет никакого маркера еще для линейки для отслеживания. Первый шаг в добавлении маркера, тогда, должен создать один, с помощью NSRulerMarkerinitWithRulerView:markerLocation:image:imageOrigin: метод. Как только новый маркер создается, Вы даете представлению линейки команду обрабатывать перетаскивание его на себя путем отправки ему a trackMarker:withMouseEvent: сообщение. Средние значения выполнения этого должны использовать событие от нажатия мыши от клиентского метода просмотра rulerView:handleMouseDown:, как описано в Обработке Событий от нажатия мыши в области Линейки. Другой должен создать пользовательский объект представления — который обычно находится в представлении аксессуара линейки — который выводит на экран прототипные маркеры, и это обрабатывает событие mouseDown путем создания нового маркера для линейки и вызова trackMarker:withMouseEvent: с новым маркером и тем событием mouseDown.

Как только Вы инициировали дополнительный процесс, вещи продолжаются таким же образом что касается перемещения маркера. Представление линейки отправляет новый маркер a trackMouse:adding: сообщение, с YES как второй параметр, чтобы указать, что просто не перемещается маркер. Маркер, добавляемый тогда, отправляет клиентское представление a rulerView:shouldAddMarker: сообщение, и если клиент утверждает, то оно неоднократно отправляет rulerView:willAddMarker:atLocation: сообщения как пользователь перемещают маркер на линейке. Пользователь может вырвать маркер, чтобы избежать добавить его или отпускать кнопку мыши по линейке, когда клиент получает a rulerView:didAddMarker: сообщение.

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

Обработка событий от нажатия мыши в области линейки

В дополнение к обработке пользовательского манипулирования маркерами линейка сообщает своему клиентскому представлению, когда пользователь нажимает кнопку мыши, в то время как мышь в области линейки (где знаки «диез» нарисованы) путем отправки ему a rulerView:handleMouseDown: сообщение. Эта информация позволяет клиентскому представлению принимать некоторые специальные меры, такие как добавление нового маркера к линейке, как описано в Добавляющих Маркерах. Этот подход работает хорошо, когда довольно ясно, какой маркер будет создаваться. Клиентское представление может также использовать это сообщение в качестве сигнала, чтобы изменить его дисплей в некотором роде — например, добавить или удалить инструкцию, помогающую пользователю в разметке и выравнивании элементов в представлении.