Тени

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

Рисунок 7-1  тень
A shadow

Тени имеют три характеристики:

В этой главе описываются, как тени работают, и показывает, как использовать Кварц 2D API для создания их.

Рисунок 7-2  тень без размытости и другого с мягким краем
A shadow with no blur and another with a soft edge

Как работают тени

Тени в Кварце являются частью состояния графики. Вы вызываете функцию CGContextSetShadow, передача графического контекста, значений смещения и значения размытости. После того, как затенение установлено, любому объекту, который Вы рисуете, нарисовали тень с черным цветом, имеющим 1/3 альфа-значение в устройстве цветовое пространство RGB. Другими словами, тень нарисована с помощью набора значений RGBA для {0, 0, 0, 1.0/3.0}.

Можно нарисовать окрашенные тени путем вызывания функции CGContextSetShadowWithColor, передавая графический контекст, значения смещения, значение размытости и объект CGColor. Значения для предоставления для цвета зависят от цветового пространства, которое Вы хотите подойти к концу.

При сохранении состояния графики перед вызовом CGContextSetShadow или CGContextSetShadowWithColor, можно выключить затенение путем восстановления состояния графики. Вы также отключаете тени путем выбирания цвета тени к NULL.

Соглашения рисования тени варьируются на основе контекста

Смещения описали, ранее указывают, где тень расположена связанная с изображением, которые бросают тень. Те смещения интерпретируются контекстом и используются для вычисления расположения тени:

Рисование с тенями

Выполните эти шаги для рисования тенями:

  1. Сохраните состояние графики.

  2. Вызовите функцию CGContextSetShadow, передача надлежащих значений.

  3. Выполните все получение, к которому Вы хотите применить тени.

  4. Восстановите состояние графики.

Выполните эти шаги для рисования цветными тенями:

  1. Сохраните состояние графики.

  2. Создайте объект CGColorSpace гарантировать, что Кварц интерпретирует значения цвета тени правильно.

  3. Создайте объект CGColor, указывающий цвет тени, который Вы хотите использовать.

  4. Вызовите функцию CGContextSetShadowWithColor, передача надлежащих значений.

  5. Выполните все получение, к которому Вы хотите применить тени.

  6. Восстановите состояние графики.

Эти два прямоугольника на рисунке 7-3 нарисованы с тенями — один с цветной тенью.

Рисунок 7-3  цветная тень и серая тень
A colored shadow compared to a gray one

Функция в Перечислении 7-1 показывает, как установить тени для рисования прямоугольников, показанных на рисунке 7-3. Подробное объяснение каждой пронумерованной строки кода появляется после перечисления.

Перечисление 7-1  функция, устанавливающая тени

void MyDrawWithShadows (CGContextRef myContext, // 1
                         CGFloat wd, CGFloat ht);
{
    CGSize          myShadowOffset = CGSizeMake (-15,  20);// 2
    CGFloat           myColorValues[] = {1, 0, 0, .6};// 3
    CGColorRef      myColor;// 4
    CGColorSpaceRef myColorSpace;// 5
 
    CGContextSaveGState(myContext);// 6
 
    CGContextSetShadow (myContext, myShadowOffset, 5); // 7
    // Your drawing code here// 8
    CGContextSetRGBFillColor (myContext, 0, 1, 0, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3 + 75, ht/2 , wd/4, ht/4));
 
    myColorSpace = CGColorSpaceCreateDeviceRGB ();// 9
    myColor = CGColorCreate (myColorSpace, myColorValues);// 10
    CGContextSetShadowWithColor (myContext, myShadowOffset, 5, myColor);// 11
    // Your drawing code here// 12
    CGContextSetRGBFillColor (myContext, 0, 0, 1, 1);
    CGContextFillRect (myContext, CGRectMake (wd/3-75,ht/2-100,wd/4,ht/4));
 
    CGColorRelease (myColor);// 13
    CGColorSpaceRelease (myColorSpace); // 14
 
    CGContextRestoreGState(myContext);// 15
}

Вот то, что делает код:

  1. Берет три параметра — графический контекст и ширина и высота для использования при построении прямоугольников.

  2. Объявляет и создает объект CGSize, содержащий значения смещения для тени. Эти значения указывают, что тень сместила 15 модулей налево от объекта и 20 модулей выше объекта.

  3. Объявляет массив значений цвета. Этот пример использует RGBA, но эти значения не возьмут значения, пока они не будут переданы Кварцу вместе с цветовым пространством, которое необходимо для Кварца для интерпретации значений правильно.

  4. Объявляет хранение для цветной ссылки.

  5. Объявляет хранение для ссылки цветового пространства.

  6. Сохраняет текущее состояние графики так, чтобы можно было восстановить его позже.

  7. Устанавливает тень для имения ранее заявленных значений смещения и значения размытости 5, который указывает мягкий теневой край. Тень будет казаться серой, имея значение RGBA {0, 0, 0, 1/3}.

  8. Следующие две строки кода рисуют прямоугольник на правой стороне рисунка 7-3. Вы заменяете эти строки своим собственным кодом для прорисовки.

  9. Создает устройство цветовое пространство RGB. Необходимо предоставить цветовое пространство при создании объекта CGColor.

  10. Создает объект CGColor, предоставляя устройство цветовое пространство RGB и значения RGBA, объявленные ранее. Этот объект указывает цвет тени, который в этом случае является красным с альфа-значением 0,6.

  11. Устанавливает цветную тень, предоставляя красный цвет, который Вы просто создали. Тень использует смещение, создаваемое ранее и значение размытости 5, который указывает мягкий теневой край.

  12. Следующие две строки кода рисуют прямоугольник на левой стороне рисунка 7-3. Вы заменяете эти строки своим собственным кодом для прорисовки.

  13. Выпускает цветовой объект, потому что он больше не необходим.

  14. Выпускает объект цветового пространства, потому что он больше не необходим.

  15. Восстанавливает состояние графики к тому, чем это было до установки теней.