2014-07-22 9 views
0

는 나는 다음과 같은 코드로 OneView 이름 NSView 서브 클래스가 있습니다에서변경 NSGradient 색상과 10.8

#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 

뷰가 처음 예상대로 그라데이션 초기화하지만 난 gradie를 변경할 수 없습니다입니다로드 nt는 IBAction입니다. 레이어 기반 뷰를 사용하여이 작업을 수행했지만 이전 버전과의 호환성을 위해 레이어를 사용하지 않는 방법을 찾으려고합니다.

IBAction이 그라데이션을 변경하지 않는지에 대한 의견이 있으십니까?

enter image description here

답변

0

문제는 함수 내부 drawRect:self.gradient = [[NSGradient alloc] initWithStartingColor:top endingColor:btm];이다. if (!self.gradient) { self.gradient = [[NSGradient alloc] initWithStartingColor:top endingColor:btm]; }으로 변경하면 문제가 해결됩니다. 그건 그렇고, 당신은 drawRect: 방법 안에 그라데이션을 생성해서는 안됩니다. 그것은 성능을 해칠 것입니다. 이 경우 awakeFromNib 메서드에 초기화를 넣어야합니다.

0

당신의 drawRect : 방법은 항상 그 안에 같은 것을 그려 넣을 것입니다. drawRect 외부로 그려서는 안됩니다 : 그래도 그라디언트가 nil이면 viewWillDraw에서 그래디언트 만 설정하면됩니다.

그래디언트의 색상을보기의 속성으로 설정해야 할 수도 있습니다. 그런 다음 KVO를 사용하여 setNeedsDisplay를 호출하여 색상 변경을 관찰하고 응답하십시오. 예

더 필요하면 컴퓨터에서 다시 게시 할 수 있습니다.

+0

몇 가지 예제 코드로 자세히 설명하십시오. 특히 KVO 사용에. – wigging