0

次のコードで名前が付けられたNSViewサブクラスがあります。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メソッドからグラデーションを変更できません。レイヤーに基づくビューを使用してこれを達成しましたが、下位互換性のためにレイヤーに依存しない方法を見つけようとしています。

IBActionがグラデーションを変更しない理由について何か考えはありますか?

ここに画像の説明を入力

4

2 に答える 2