Scroll View + Custom Viewその2

前回作成したサンプルではスクロール処理自体はすべておまかせでいいのですが、私の要求としてはスクロール中もCustom Viewのどの位置を表示しているか知りたいのです。
いろいろ調べて見た結果、NSScrollerのイベントをIBActionハンドラで処理すればよいことがわかりました。
ただ注意点として、この設定をするとスクロール処理をすべて自前で行わなければならい事です。
コードとしては以下のようになります。

- (IBAction)onScroller:(id)sender
{
	NSScrollerPart nPart = [(NSScroller *)sender hitPart];
	NSRect rectVisible = [(NSClipView *)[outView superview] documentVisibleRect];
	NSRect rectBounds = [outView bounds];

	NSLog( @"hitPart=%d, x=%f", nPart, rectVisible.origin.x );

	switch ( nPart ) {
		case NSScrollerIncrementLine:
			mViewOrg.x += 10;
			if ( mViewOrg.x + rectVisible.size.width >= rectBounds.size.width ) {
				mViewOrg.x = rectBounds.size.width - rectVisible.size.width;
			}
			break;
		case NSScrollerDecrementLine:
			mViewOrg.x -= 10;
			if ( mViewOrg.x < 0 ) {
				mViewOrg.x = 0;
			}
			break;
		case NSScrollerIncrementPage:
			mViewOrg.x += 100;
			if ( mViewOrg.x + rectVisible.size.width >= rectBounds.size.width ) {
				mViewOrg.x = rectBounds.size.width - rectVisible.size.width;
			}
			break;
		case NSScrollerDecrementPage:
			mViewOrg.x -= 100;
			if ( mViewOrg.x < 0 ) {
				mViewOrg.x = 0;
			}
			break;
		case NSScrollerKnob:
		case NSScrollerKnobSlot:
			{
				CGFloat fPos = [(NSScroller *)sender floatValue];
				mViewOrg.x = (rectBounds.size.width - rectVisible.size.width) * fPos;
			}
			break;
	}
	[outView scrollPoint:mViewOrg];
}

サンプルプログラムのダウンロード(33KB)

【作成・確認環境】
MacOS X v10.6.4
Xcode v3.2.3

一覧に戻る