Scroll Viewへの座標軸描画ではまる(-_-;)

音声波形の表示を行うに当たってScroll Viewに座標軸を描画する処理を追加したのですが、座標軸はスクロールしても固定になるように描画座標を計算して描画しているにも関わらずスクロールバーでスクロールを行うと座標軸自体もスクロールされてしまい、座標軸の描画座標は正しいにも関わらず崩れてしまいます。

【スクロール前】

【スクロール後】

いろいろ試行錯誤したところInterface BuilderでScroll Viewの"Copy On Scroll"のチェックを外すことで目的とする動きになりました。

ロジックは正しいはずなのに思うように動かず二日間も費やしてしまったのでちょっと力が抜けてしまいました。(-_-;)

実験に使用したコードを以下に示します。

// 座標軸の分割数
#define DIV_CNT_X_AXIS		10
#define DIV_CNT_Y_AXIS		4

@implementation MyView

- (id)initWithFrame:(NSRect)frame {
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
		mAxisLine = nil;
    }
    return self;
}

- (void)drawRect:(NSRect)dirtyRect {
    // Drawing code here.
	NSRect rect = [self bounds];
	
	// 背景描画
	[[NSColor blackColor] set];
	[NSBezierPath fillRect:rect]; 
	
	// 座標軸表示
	[self createAxisBezierPath];
	if ( mAxisLine != nil ) {
		[[NSColor greenColor] set];
		[mAxisLine stroke];
	}
}

//
// 座標軸の生成
//
- (void)createAxisBezierPath
{
	int				i;
	NSPoint			pt;
	NSBezierPath	*oBP = [NSBezierPath bezierPath];
	NSRect			rectVisible = [(NSClipView *)[self superview] documentVisibleRect]; 

	NSLog( @"createAxisBezierPath: x=%f, y=%f, w=%f h=%f\n", rectVisible.origin.x, rectVisible.origin.y, rectVisible.size.width, rectVisible.size.height );
	
	// X軸
	for ( i = 1; i < DIV_CNT_X_AXIS; i++ ) {
		float   x = (rectVisible.size.width / (float)DIV_CNT_X_AXIS) * i + rectVisible.origin.x;
		NSLog( @" x=%f\n", x );
		pt = NSMakePoint( x, 0 );
		[oBP moveToPoint:pt];
		pt = NSMakePoint( x, rectVisible.size.height );
		[oBP lineToPoint:pt];
	}

	// Y軸
	for ( i = 1; i < DIV_CNT_Y_AXIS; i++ ) {
		float   y = (rectVisible.size.height / (float)DIV_CNT_Y_AXIS) * i;
		pt = NSMakePoint( rectVisible.origin.x, y );
		[oBP moveToPoint:pt];
		pt = NSMakePoint( rectVisible.origin.x + rectVisible.size.width, y );
		[oBP lineToPoint:pt];
	}
	
	if ( mAxisLine != nil ) {
		[mAxisLine release];
	}
	mAxisLine = [oBP retain];
}

@end

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

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

一覧に戻る