【问题标题】:Change NSGradient colors in OSX 10.7 and 10.8在 OS X 10.7 和 10.8 中更改渐变颜色
【发布时间】:2014-07-22 02:39:05
【问题描述】:

我有一个名为OneViewNSView 子类,代码如下:

#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(或任何其他类)中,我试图通过调用OneView 类的changeGradient 方法来更改渐变的颜色:

#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 方法更改渐变。我已经使用支持图层的视图实现了这一点,但我正在尝试找到一种不依赖图层来实现向后兼容性的方法。

关于为什么IBAction 不改变渐变有什么想法吗?

【问题讨论】:

    标签: objective-c cocoa nsview nscolor nsgradient


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      您可能应该重新设计以使渐变的颜色也成为视图的属性。 然后使用 KVO 通过调用 setNeedsDisplay:YES 来观察和响应任何颜色变化

      如果您需要更多,我可以在返回计算机后发布。

      【讨论】:

      • 请详细说明一些示例代码。尤其是在使用 KVO 时。
      猜你喜欢
      • 2012-03-24
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2012-07-10
      • 1970-01-01
      • 1970-01-01
      • 2023-04-06
      • 1970-01-01
      相关资源
      最近更新 更多