Вопрос
Я пытаюсь нарисовать внутреннюю тень в NSView.Сама по себе тень не является проблемой, но настройка цвета сводит меня с ума :/
#define ShadowBlurRadius 10.0
#define SRGB (CGFloat [4]){184.0, 184.0, 184.0, 1.0}
@implementation SWShadowedView
- (void)drawRect:(NSRect)dirtyRect {
NSGraphicsContext *context = [NSGraphicsContext currentContext];
[context saveGraphicsState];
[context setCompositingOperation:NSCompositePlusDarker];
NSBezierPath *path = [NSBezierPath bezierPathWithRect:NSMakeRect(0, dirtyRect.size.height -ShadowBlurRadius, self.superview.frame.size.width, ShadowBlurRadius)];
[[NSColor whiteColor] setStroke];
NSShadow * shadow = [[NSShadow alloc] init];
NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
NSColor *color = [NSColor colorWithColorSpace:colorSpace components:SRGB count:4];
[shadow setShadowColor:color];
[shadow setShadowBlurRadius:ShadowBlurRadius];
[shadow set];
[path stroke];
[context restoreGraphicsState];
[super drawRect:dirtyRect];
}
@end
Если я заменю цвет тени на [NSColor redColor], это сработает, но с неправильным цветом.Вот откуда я взял sRGB: ссылка
Способ преобразования sRGB в NSColor взят из другого поста отсюда, но, очевидно, он не работает.
с уважением
Решение
Используйте
Вы можете создать цвет с RGB, как это:
.float red = 182.0f/256.0f;
float green = 182.0f/256.0f;
float blue = 182.0f/256.0f;
NSColor *color = [NSColor colorWithCalibratedRed:red green:green blue:blue alpha:1.0f];
Другие советы
Ваш код почти полностью корректен, единственная проблема заключается в том, что вы используете числовые значения от 0 до 255 в вашем массиве.Все NSColor
использование методов создания CGFloat
значения от 0 до 1,0.
Все, что вам нужно сделать, это определить свой SRGB
массив, подобный этому:
#define SRGB (CGFloat [4]){184.0/255.0, 184.0/255.0, 184.0/255.0, 1.0}
Тогда ваш код будет работать корректно.Пожалуйста, обратите внимание, что с помощью colorWithCalibratedRed:green:blue:alpha:
способ получения NSColor
будет нет укажите правильный цвет на основе ваших значений sRGB.
Чтобы получить правильные значения sRGB, вы должны использовать метод в вашем исходном коде, который специально использует цветовое пространство sRGB для создания цвета.Категория на NSColor
который создает цвета с использованием значений sRGB на основе 255, может выглядеть примерно так:
@implementation NSColor (sRGB_Additions)
+ (NSColor *)colorWith255sRGBRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha
{
CGFloat sRGBComponents[4] = {red / 255.0, green / 255.0, blue / 255.0, alpha};
NSColorSpace *colorSpace = [NSColorSpace sRGBColorSpace];
return [NSColor colorWithColorSpace:colorSpace components:sRGBComponents count:4];
}
@end
Тогда вы могли бы просто сделать это:
NSColor* someColor = [NSColor colorWith255sRGBRed:184.0 green:184.0 blue:184.0 alpha:1.0];
Вот самый простой, самый современный способ создания цвета, который вам нужен:
NSColor *color = [NSColor colorWithSRGBRed:(184.0 / 255.5) green:(184.0 / 255.5) blue:(184.0 / 255.5) alpha:1.0];
.