2014-12-15 1 views
3

단일 색상을 표시하는 사용자 정의보기를 만들고 있는데, 이것은 이미지의 색상 선택기 용이므로 색상이 상당히 빠르게 변경 될 수 있습니다. 커서가 움직일 때 깜박이는 것을 방지하기 위해 색상 변경이 0.2 초 이상 이루어 지도록했습니다.원형 CALayer 주위가 더 어둡습니다.

저는 CALayer를 사용하여이 작업을 수행하고 있습니다. 현재이 기능은 거의 의도 한대로 작동하지만 OS X Yosemite close & 크기 조정 윈도우 버튼과 비슷한 약간 더 어두운 색상의 내용이있는 레이어 주위에 윤곽선이 필요합니다. 내가 현재 사용하고

Circle with dark outline

방법은 일을하지만, 때로는 테두리 색상 애니메이션 메인 컬러 애니메이션을 따르지 않는 것 같다 않는 경우에 따라서는 밝은 색상을 통해 이동합니다. 필터를 사용하여이 작업을 수행 할 수 있다고 생각했지만 실제로이 작업을 수행하는 방법에 관해서는 완전히 혼란 스럽습니다. 온라인에서 많은 문서를 찾을 수 없었습니다. CoreAnimation에 대한 경험이 거의 없으므로 이것이 최선의 방법인지 또는 눈에 띄게 분명한 경우 확실하지 않습니다. CAKeyframeAnimation 대신 CABasicAnimation의를 사용하여

- (id)initWithFrame:(NSRect)frame{ 
    self = [super initWithFrame:frame]; 
    if (self) { 
     _pickerColour = [NSColor whiteColor]; 
     strokeColour = [NSColor whiteColor]; 

     [self setWantsLayer: true]; 

     innerLayer = [CALayer layer]; 
     [innerLayer setCornerRadius: frame.size.width/2]; 
     [innerLayer setBorderWidth: 4]; 
     [innerLayer setFrame: CGRectMake(frame.origin.x - frame.size.width/2, frame.origin.y - frame.size.width/2, frame.size.width - 2, frame.size.height - 2)]; 

     [self.layer addSublayer:innerLayer]; 
    } 

    return self; 
} 

- (void) setPickerColour:(NSColor *)pickerColour{ 
    CABasicAnimation *backgroundAnimation = [CABasicAnimation animationWithKeyPath:@"backgroundColor"]; 
    backgroundAnimation.fillMode = kCAFillModeForwards; 
    backgroundAnimation.removedOnCompletion = NO; 
    backgroundAnimation.fromValue = (id)self.pickerColour.CGColor; 
    backgroundAnimation.toValue = (id)pickerColour.CGColor; 
    backgroundAnimation.duration = 0.1f; 
    [innerLayer addAnimation:backgroundAnimation forKey:@"backgroundColor"]; 

    CGFloat h,s,b,a; 
    [[self.pickerColour colorUsingColorSpaceName: NSCalibratedRGBColorSpace] getHue:&h saturation:&s brightness:&b alpha:&a]; 
    NSColor *newStrokeColour = [NSColor colorWithHue:h saturation:MIN(s, 1.0) brightness: MAX(b/1.2, 0.0) alpha:a]; 

    CABasicAnimation *borderAnimation = [CABasicAnimation animationWithKeyPath:@"borderColor"]; 
    borderAnimation.fillMode = kCAFillModeForwards; 
    borderAnimation.removedOnCompletion = NO; 
    borderAnimation.fromValue = (id)strokeColour.CGColor; 
    borderAnimation.toValue = (id)newStrokeColour.CGColor; 
    borderAnimation.duration = 0.1f; 
    [innerLayer addAnimation:borderAnimation forKey:@"borderColor"]; 

    strokeColour = newStrokeColour; 
    _pickerColour = pickerColour; 
} 

- (NSColor *) pickerColour{ 
    return _pickerColour; 
} 
+0

이것이 단순히 HSV/HSB 공간이 아닌 RGB로 작동하는 Core Animation의 효과일까요? 확실하게 RGB 큐브를 통과하는 경로가 종점이 똑같이 밝아도 다양한 밝기의 색상을 통과하지 못하도록 보장하지는 않습니다. – warrenm

+0

글쎄, 그래서 필터 나 비슷한 것을 사용하여 실제와 같은 것을 보여주고 싶습니다. 더 단순한 전환이 아닌 어두운 버전입니다. –

+0

RGB 공간 대신 ​​HSV 공간에서 명시 적으로 보간하는 값을 갖는 키 프레임 애니메이션을 사용할 수 있습니다 ... – warrenm

답변

2

, 당신은 색 공간을 통해 경로의 구분 표시를 포함 valueskeyTimes 배열을 제공 할 수 있습니다. NSColor 편리한 방법을 사용할 수 있지만 RGB 공간을 통한 기본 선형 궤도 대신 HSV 공간에서 원하는 호를 따라갈 수있는 충분한 수의 색상을 지정합니다.