[Mac] NSScrollView - スクロール時のイベントを受け取る

2011年1月23日日曜日 | Published in | 0 コメント

このエントリーをはてなブックマークに追加

てっきり NSScrollViewDelegate があって、そこでスクロールイベントが受け取れるものだと思っていたら NSScrollViewDelegate なんてのは存在しないことに気がついた。※iOS の場合だと UIScrollView には UIScrollViewDelegate が存在して、そこのメソッドでイベントを受け取れる。

スクロールイベントを取りたい場合、直接 NSScrollView を使うのではなく、NSScrollView が内包している NSView の通知を利用する。利用方法は公式リファレンスにサンプルのコードが参考になる。
Scroll View Programming Guide for Cocoa: Synchronizing Scroll Views

使う通知は NSViewBoundsDidChangeNotification。これを NSScrollViewの中のビューへ仕掛けておく。こんな感じ。
-(void)awakeFromNib {
 :
NSView* contentView = [scrollView contentView];

[[NSNotificationCenter defaultCenter] addObserver:self
 selector:@selector(didScroll:)
 name:NSViewBoundsDidChangeNotification
 object:contentView];
 :
}
NSScrollView 内のビューの bounds に変化があった時に通知がくる。
- (void)didScroll:(NSNotification*) notification 
{
 NSClipView* contentView = [notification object];
  :
}

- - - -
こうやって APIを比較すると一から作り直した UIKit は、従来のCocoa(AppKit)の良い点をうまく取り込み、悪い点を改善しているのがよくわかる。Cocoaも 10.6から Delegateをベースとした形になっているが過渡期で綺麗じゃないといった感じは否めない。

Responses

Leave a Response

人気の投稿(過去 30日間)