Прокрутка представления документа

Документ представления прокрутки просматривает прокрутки в ответ на одно из следующих действий:

Прокрутка к определенному расположению

Приложения часто должны прокручивать к определенному расположению в представлении документа из-за некоторого пользовательского действия, не связанного с прокруткой. Например, когда пользователь ищет документ, они ожидают, что документ прокрутит для показа найденного элемента. 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:).