Прокрутка представления документа
Документ представления прокрутки просматривает прокрутки в ответ на одно из следующих действий:
Пользователь щелкает в одном из скроллеров или поворачивает колесико прокрутки мыши или шар прокрутки. Эти случаи обрабатываются автоматически
NSScrollViewкласс.Представление прокрутки должно прокрутить к определенному расположению — например, для отображения текущего выбора в ответ на пользовательское действие. Приложение ответственно за реализацию этой функциональности, как описано в Прокрутке К Определенному Расположению.
Пользователь перетаскивает мышь вне представления прокрутки, заставляя автопрокрутку произойти. Представление документа ответственно за поддержку автопрокрутки в ответ на события перетаскивания мышь, как описано в Поддержке Автоматической Прокрутки.
Прокрутка к определенному расположению
Приложения часто должны прокручивать к определенному расположению в представлении документа из-за некоторого пользовательского действия, не связанного с прокруткой. Например, когда пользователь ищет документ, они ожидают, что документ прокрутит для показа найденного элемента. NSView класс обеспечивает высокоуровневые методы прокрутки, автоматически обновляющие скроллеры и восстанавливающие изображение представления документа как требуется. NSClipView и NSScrollView методы классов предоставляют низкоуровневую поддержку прокрутки, требующую, чтобы приложение обновило скроллеры и отметило представление документа для дисплея.
Два NSView поддержка методов, прокручивающая для раскрытия определенное расположение: scrollPoint: и scrollRectToVisible:. Эти высокоуровневые методы прокручивают указанную точку или прямоугольник к источнику довольного представление. Вы отправляете эти методы в представление документа представления прокрутки или одному из его потомков. От сообщений прокрутки отказываются через иерархию представления к самому близкому включению NSClipView экземпляр. NSView также обеспечивает удобный метод, enclosingScrollView, это возвращается NSScrollView экземпляр, содержащий получатель, позволяя представлению взаимодействовать непосредственно с родительским представлением прокрутки. Если получатель не содержится в представлении прокрутки, enclosingScrollView возвраты nil.
Фрагмент кода в Перечислении 1 иллюстрирует, как прокрутить к верху и низу представления документа. Ориентация представления документа определяет, где источник довольного, представление находится и необходимо допускать это при вычислении верхних и нижних расположений.
Перечисление 1 , Прокручивающее к нижней части или вершине представления документа
- (void)scrollToTop:sender; |
{ |
NSPoint newScrollOrigin; |
// assume that the scrollview is an existing variable |
if ([[scrollview documentView] isFlipped]) { |
newScrollOrigin=NSMakePoint(0.0,0.0); |
} else { |
newScrollOrigin=NSMakePoint(0.0,NSMaxY([[scrollview documentView] frame]) |
-NSHeight([[scrollview contentView] bounds])); |
} |
[[scrollview documentView] scrollPoint:newScrollOrigin]; |
} |
- (void)scrollToBottom:sender; |
{ |
NSPoint newScrollOrigin; |
// assume that the scrollview is an existing variable |
if ([[scrollview documentView] isFlipped]) { |
newScrollOrigin=NSMakePoint(0.0,NSMaxY([[scrollview documentView] frame]) |
-NSHeight([[scrollview contentView] bounds])); |
} else { |
newScrollOrigin=NSMakePoint(0.0,0.0); |
} |
[[scrollview documentView] scrollPoint:newScrollOrigin]; |
} |
Низкоуровневые методы прокрутки обходят adjustScroll: механизм описан в Ограничении Прокрутки.
Поддержка автоматической прокрутки
Прокрутите прокрутку представлений автоматически, поскольку пользователь перетаскивает мышь за пределами предметной области представления прокрутки, если представление документа или потомок, вызывает NSView метод autoscroll: поскольку это обрабатывает событие перетаскивания мышь. Поддержка автопрокрутки позволяет пользователю перетаскивать мышь, перемещение или выбирание элементов, и иметь представление прокрутки постоянно выводят на экран активную часть документа.
Подклассы представления должны отправить autoscroll: сообщения как часть их кода обработки перетаскивания мышь, передавая ток NSEvent возразите как параметр. autoscroll: если получатель не содержится в представлении прокрутки, метод ничего не делает. Перечисление 2 показывает типичное NSView реализация подкласса a mouseDragged: метод, поддерживающий автоматическую прокрутку.
Перечисление 2 , Поддерживающее автоматическую прокрутку в a mouseDragged: реализация
-(void)mouseDragged:(NSEvent *)event |
{ |
NSPoint dragLocation; |
dragLocation=[self convertPoint:[event locationInWindow] |
fromView:nil]; |
// support automatic scrolling during a drag |
// by calling NSView's autoscroll: method |
[self autoscroll:event]; |
// act on the drag as appropriate to the application |
} |
Определение текущего расположения прокрутки
Можно определить текущее видимое расположение в представлении прокрутки путем исследования границ его представления клипа. Источник границ представления клипа подходит для использования с scrollPoint: восстановить расположение прокрутки позже. Фрагмент кода в Перечислении 3 демонстрирует получение текущего расположения прокрутки представления прокрутки и восстановление его.
Перечисление 3 , Добирающееся и устанавливающее текущее расположение прокрутки представления
// get the current scroll position of the document view |
NSPoint currentScrollPosition=[[theScrollView contentView] bounds].origin; |
// restore the scroll location |
[[theScrollView documentView] scrollPoint:currentScrollPosition]; |
Ограничение прокрутки
Подклассы NSView переопределите adjustScroll: метод для обеспечения представления тонкозернистое управление его позиции во время прокрутки. Пользовательский подкласс представления может квантовать прокрутку в регулярные модули — к краям ячеек электронной таблицы, например — или просто ограничить прокрутку определенной областью представления. adjustScroll: метод обеспечивает предложенный прямоугольник, который механизм прокрутки сделает видимым и ожидает, что подкласс возвратит переданный прямоугольник или измененный прямоугольник, который ограничит прокрутку.
Перечисление 4 показывает реализацию adjustScroll: это ограничивает прокрутку представления к инкрементам на 72 пикселя, перетаскивая кнопку прокрутки.
Ограничение перечисления 4, прокручивающее с adjustScroll:
- (NSRect)adjustScroll:(NSRect)proposedVisibleRect |
{ |
NSRect modifiedRect=proposedVisibleRect; |
// snap to 72 pixel increments |
modifiedRect.origin.x = (int)(modifiedRect.origin.x/72.0) * 72.0; |
modifiedRect.origin.y = (int)(modifiedRect.origin.y/72.0) * 72.0; |
// return the modified rectangle |
return modifiedRect; |
} |
adjustScroll: когда прокрутка инициируется методами прокрутки низшего уровня, предоставленными, метод не используется NSClipView (scrollToPoint:) и NSScrollView (scrollRectToVisible:).