SourceListの下に付けるボタン等のコンテナになるOSX10.10でもそれ以前でも使える"ヒドイ"カスタムビュー

![macmini.png](https://qiita-image-store.s3.amazonaws.com/0/2117/59dd07f6-bfe5-7108-838e-debd22504db1.png) ![受信（129_件のメッセージ）.png](https://qiita-image-store.s3.amazonaws.com/0/2117/9b055e22-40bc-dcf8-63ca-37ca87c9e46e.png)
OSX 10.10 Yosemite より NSTableView や NSOutlineView のselectionHighlightStyle を NSTableViewSelectionHighlightStyleSourceList に変えたときの見た目が以前とは別物になりました。
まあそれはいいのですが、Yosemite以前ではソースリストの下部などに表示するコントロールのコンテナはカスタムビュークラスを作りソースリストの背景色を拝借して描画していたのですが、Yosemiteでは NSVisualEffectView というクラスが用意されそれを利用するようになりました。
Yosemite以前もターゲットに入れているとOSXのバージョンによって差し替えるというアレな状態になってしまいました。
これはIBでペタペタが非常にやりにくい。

で、IBでペタペタ貼れてYosemite以前の実装にちょっと手を加えるだけですむ、**ヒドイ**カスタムビューを作りました。

**ヒドイ**けど動くからいいんです！　動くことが正義！　コンパイラの警告もありません！

（Yosemiteで使用されるのは `-initWithFrame:` のみです）


```objc:HMSourceListColoredView.h
#import <Cocoa/Cocoa.h>
 
@interface HMSourceListColoredView : NSView
@end
```

```objc: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
```