SourceList 아래에 붙이는 버튼 등의 컨테이너가 되는 OSX10.10에서도 그 이전에도 사용할 수 있는 "히도이"커스텀 뷰


OSX 10.10 Yosemite 에서 NSTableView 와 NSOutlineView 의 selectionHighlightStyle 를 NSTableViewSelectionHighlightStyleSourceList 로 바꾸었을 때의 외형이 이전과는 별개가 되었습니다.
글쎄요, 괜찮습니다만, Yosemite 이전에는 소스 리스트의 하부 등에 표시하는 컨트롤의 컨테이너는 커스텀 뷰 클래스를 만들고 소스 리스트의 배경색을 빌려 그려 있었습니다만, Yosemite에서는 NSVisualEffectView 라고 하는 클래스가 준비되어 그것을 이용하게 되었습니다.
Yosemite 이전에도 타겟에 넣고 있으면 OSX의 버전에 의해 교체한다는 알레한 상태가 되어 버렸습니다.
이것은 IB에서 페타페타가 매우 하기 어렵다.

그래서, IB에서 페타 페타 붙여 Yosemite 이전의 구현에 조금 손을 추가하는 것만으로 함, 히도이 커스텀 뷰를 만들었습니다.

히도이지만 움직이기 때문에 좋다! 움직이는 것이 정의! 컴파일러 경고도 없습니다!

(Yosemite는 -initWithFrame:에만 사용됩니다.)

HMSourceListColoredView.h
#import <Cocoa/Cocoa.h>

@interface HMSourceListColoredView : NSView
@end

HMSourceListColoredView.m
#import "HMSourceListColoredView.h"

@interface HMSourceListColoredView ()
@property (strong, nonatomic) NSColor *backgroundColor;
@property (nonatomic, getter=isObservingKeyState) BOOL observingKeyState;
@end

@implementation HMSourceListColoredView
- (instancetype)initWithFrame:(NSRect)frameRect
{
    // 使わなくてもイニシャライズはしないとダメです
    self = [super initWithFrame:frameRect];

    // NSVisualEffectView クラスがあればそのインスタンスを返す
    if([NSVisualEffectView class]) {
        NSVisualEffectView *view = [[NSVisualEffectView alloc] initWithFrame:frameRect];
        return (HMSourceListColoredView *)view;
    }

    return self;
}
- (void)dealloc
{
    if (self.isObservingKeyState) {
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:NSWindowDidBecomeKeyNotification
                                                      object:[self window]];
        [[NSNotificationCenter defaultCenter] removeObserver:self
                                                        name:NSWindowDidResignKeyNotification
                                                      object:[self window]];
    }
}

- (void)viewDidMoveToWindow
{
    // NSTableViewを作ってその背景色を拝借する
    NSTableView *tableView = [[NSTableView alloc] init];
    [tableView setSelectionHighlightStyle:NSTableViewSelectionHighlightStyleSourceList];
    _backgroundColor = [tableView backgroundColor];
    [self addWindowKeyStateObservers];
}

- (void)addWindowKeyStateObservers
{
    if (!self.isObservingKeyState) {
        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(redisplay)
                                                     name:NSWindowDidBecomeKeyNotification
                                                   object:[self window]];

        [[NSNotificationCenter defaultCenter] addObserver:self
                                                 selector:@selector(redisplay)
                                                     name:NSWindowDidResignKeyNotification
                                                   object:[self window]];
    }
     self.observingKeyState = YES;
}

- (void)redisplay
{
    [self setNeedsDisplay:YES];
}

- (void)drawRect:(NSRect)dirtyRect
{
    [_backgroundColor setFill];
    NSRectFill(dirtyRect);
}

@end

좋은 웹페이지 즐겨찾기