Усовершенствованные пользовательские задачи представления

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

Определение устройства вывода

Большая часть выведенного на экран изображения представления является стабильным представлением своего состояния. Объекты представления также взаимодействуют динамично с пользователем, однако, и это взаимодействие часто включает временное получение, не являющееся неотъемлемой частью самого изображения — выборы и другое выделение, например. Такое содержание должно быть выведено на экран только на экран и на никогда принтер или факс, или к области монтажа.

Можно определить, рисует ли представление на экран путем отправки текущего графического контекста isDrawingToScreen обменивайтесь сообщениями как показано в Перечислении 5-1.

Перечисление 5-1  , Тестирующее устройство вывода

- (void)drawRect:(NSRect)rect
{
    [[NSColor whiteColor] set];
    NSRectFill(rect);
 
    // draw a background grid only if we’re drawing to the screen
    if ([[NSGraphicsContext currentContext] isDrawingToScreen]) {
        [self drawGrid];
    }
 
    // insert view drawing code here
}

Получение За пределами drawRect:

Если Вы определяете методы, которые должны нарисовать в представлении, не проходя через drawRect: метод, необходимо отправить lockFocus к целевому представлению, прежде чем запускается любое получение, и отправить unlockFocus как только Вы сделаны.

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

Перечисление 5-2 иллюстрирует использование lockFocus и unlockFocus методы для определения цвета пикселя в позиции курсора. Это вызвали бы от представления mouseDown:, mouseUp:, и mouseMoved: методы в ответ на событие mouseDown в представлении.

Перечисление 5-2  Используя lockFocus и unlockFocus явно

- (void) examinePixelColor:(NSEvent *) theEvent
{
    NSPoint where;
    NSColor *pixelColor;
    float  red, green, blue;
 
    where = [self convertPoint:[theEvent locationInWindow] fromView:nil];
 
    // NSReadPixel pulls data out of the current focused graphics context, so -lockFocus is necessary here.
    [self lockFocus];
 
    pixelColor = NSReadPixel(where);
 
    // always balance -lockFocus with an -unlockFocus.
    [self unlockFocus];
 
    red = [pixelColor redComponent];
    green = [pixelColor greenComponent];
    blue = [pixelColor blueComponent];
 
    // we have the color, code that does something with it
    // would reside here
 
  }