단일 색상을 표시하는 사용자 정의보기를 만들고 있는데, 이것은 이미지의 색상 선택기 용이므로 색상이 상당히 빠르게 변경 될 수 있습니다. 커서가 움직일 때 깜박이는 것을 방지하기 위해 색상 변경이 0.2 초 이상 이루어 지도록했습니다.원형 CALayer 주위가 더 어둡습니다.
저는 CALayer를 사용하여이 작업을 수행하고 있습니다. 현재이 기능은 거의 의도 한대로 작동하지만 OS X Yosemite close & 크기 조정 윈도우 버튼과 비슷한 약간 더 어두운 색상의 내용이있는 레이어 주위에 윤곽선이 필요합니다. 내가 현재 사용하고
방법은 일을하지만, 때로는 테두리 색상 애니메이션 메인 컬러 애니메이션을 따르지 않는 것 같다 않는 경우에 따라서는 밝은 색상을 통해 이동합니다. 필터를 사용하여이 작업을 수행 할 수 있다고 생각했지만 실제로이 작업을 수행하는 방법에 관해서는 완전히 혼란 스럽습니다. 온라인에서 많은 문서를 찾을 수 없었습니다. 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;
}
이것이 단순히 HSV/HSB 공간이 아닌 RGB로 작동하는 Core Animation의 효과일까요? 확실하게 RGB 큐브를 통과하는 경로가 종점이 똑같이 밝아도 다양한 밝기의 색상을 통과하지 못하도록 보장하지는 않습니다. – warrenm
글쎄, 그래서 필터 나 비슷한 것을 사용하여 실제와 같은 것을 보여주고 싶습니다. 더 단순한 전환이 아닌 어두운 버전입니다. –
RGB 공간 대신 HSV 공간에서 명시 적으로 보간하는 값을 갖는 키 프레임 애니메이션을 사용할 수 있습니다 ... – warrenm