我有一个名为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
没有改变渐变的任何想法?
答案 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
来观察并响应任何颜色变化如果您需要更多,我可以在电脑后发帖。