在OSX 10.7和10.8中更改NSGradient颜色

时间:2014-07-22 02:39:06

标签: objective-c cocoa nsview nscolor nsgradient

我有一个名为NSView的{​​{1}}子类,代码如下:

OneView

在我的#import "OneView.h" @interface OneView () @property (strong, nonatomic) NSGradient *gradient; @end @implementation OneView - (void)drawRect:(NSRect)dirtyRect { [super drawRect:dirtyRect]; NSColor *top = [NSColor colorWithCalibratedRed:1.0 green:0.0 blue:0.0 alpha:1.0]; NSColor *btm = [NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:1.0]; self.gradient = [[NSGradient alloc] initWithStartingColor:top endingColor:btm]; [self.gradient drawInRect:self.bounds angle:270]; } # pragma mark - Public - (void)changeGradient { self.gradient = nil; NSColor *top = [NSColor colorWithCalibratedRed:0.0 green:1.0 blue:0.0 alpha:1.0]; NSColor *btm = [NSColor colorWithCalibratedRed:0.0 green:0.0 blue:0.0 alpha:1.0]; self.gradient = [[NSGradient alloc] initWithStartingColor:top endingColor:btm]; [self.gradient drawInRect:self.bounds angle:270]; [self setNeedsDisplay:YES]; } @end (或可能是任何其他类)中,我试图通过调用AppDelegate类的changeGradient方法来更改渐变的颜色:

OneView

首次加载视图时,渐变按预期初始化,但我无法从#import "AppDelegate.h" #import "OneView.h" @interface AppDelegate () @property (weak, nonatomic) IBOutlet OneView *oneView; @end @implementation AppDelegate - (IBAction)changeGradient:(id)sender { [self.oneView changeGradient]; } @end 方法更改渐变。我已经使用图层支持的视图实现了这一点,但我试图找到一种不依赖于图层以实现向后兼容的方法。

关于为什么IBAction没有改变渐变的任何想法?

enter image description here

2 个答案:

答案 0 :(得分:0)

self.gradient = [[NSGradient alloc] initWithStartingColor:top endingColor:btm];函数内的问题是drawRect:。 将其更改为if (!self.gradient) { self.gradient = [[NSGradient alloc] initWithStartingColor:top endingColor:btm]; }将解决问题。 顺便说一句,你不应该在drawRect:方法中创建渐变。这会伤害性能。在这种情况下,应该将初始化放在awakeFromNib方法中。

答案 1 :(得分:0)

你的drawRect:方法总是在其中绘制相同的东西。 你不应该试图在drawRect之外画画: 您真的只需要在viewWillDraw中设置渐变:如果渐变为nil。

您可能应该重新设计渐变的颜色也是视图的属性。 然后使用KVO通过调用setNeedsDisplay:YES

来观察并响应任何颜色变化

如果您需要更多,我可以在电脑后发帖。