Pergunta

Estou tentando desenhar uma sombra interna em um NSView.A sombra em si não é o problema, mas a configuração da cor está me deixando maluco :/

#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

Se eu substituir a cor da sombra por [NSColor redColor], ela funciona, mas com a cor errada.Foi daqui que obtive o sRGB: link

A forma de converter sRGB em NSColor foi retirada de outro post daqui mas obviamente não está funcionando.

atenciosamente

Foi útil?

Solução

Usar RGB não sRGB:

Você pode criar cores com RGB assim:

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];

Outras dicas

Seu código está quase totalmente correto, o único problema é que você está usando valores numéricos de 0 a 255 em seu array.Todos NSColor métodos de criação usam CGFloat valores de 0 a 1,0.

Tudo que você precisa fazer é definir seu SRGB matriz assim:

#define SRGB (CGFloat [4]){184.0/255.0, 184.0/255.0, 184.0/255.0, 1.0}

Seu código funcionará corretamente.Observe que usando o colorWithCalibratedRed:green:blue:alpha: método de NSColor vai não fornecer a cor correta de seus valores sRGB.

Para obter valores sRGB corretos, você deve usar o método em seu código original, que usa especificamente o espaço de cores sRGB para criar a cor.Uma categoria em NSColor que cria cores usando valores sRGB baseados em 255 pode ser mais ou menos assim:

@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

Então você poderia simplesmente fazer isso:

NSColor* someColor = [NSColor colorWith255sRGBRed:184.0 green:184.0 blue:184.0 alpha:1.0];

Aqui está a maneira mais simples e moderna de criar a cor que você precisa:

NSColor *color = [NSColor colorWithSRGBRed:(184.0 / 255.5) green:(184.0 / 255.5) blue:(184.0 / 255.5) alpha:1.0];
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top