0

私は Mac os X 用の Aaron の Cocoa プログラミングの第 17 章にいます。この例では、彼は NSScrollView に NSView を埋め込んでいます。
演習のために、NSButton をプログラムでビューに追加しました。
問題は、最初にスクロール ビューに表示されるボタンの奇妙な動作ですが、垂直スクローラーを下に移動すると、ボタンが消えてスクロール ビューの下部に再表示されます。説明)、問題をよりよく説明するためにビデオを作成しました。

http://tinypic.com/player.php?v=k1sacz&s=6

私は NSView をサブクラス化し、クラス StretchView を呼び出しました (本にあるように)。
これはコードです:

#import <Cocoa/Cocoa.h>

@interface StretchView : NSView
{
@private
    NSBezierPath* path;
}

- (NSPoint) randomPoint;
- (IBAction) click : (id) sender;

@end


#import "StretchView.h"

@implementation StretchView

- (void) awakeFromNib
{
    // Here I add the button
    NSView* view=self;
    NSButton* button=[[NSButton alloc] initWithFrame: NSMakeRect(10, 10, 200, 100)];
    [button setTitle: @"Click me"];
    [button setTarget: self];
    [button setAction: @selector(click:)];
    [view addSubview: button];
}

- (IBAction) click:(id)sender
{
    NSLog(@"Button clicked");
}

- (void) drawRect:(NSRect)dirtyRect
{
    NSRect bounds=[self bounds];
    [[NSColor greenColor] set];
    [NSBezierPath fillRect: bounds];
    [[NSColor whiteColor] set];
    [path fill];
}

- (id) initWithFrame:(NSRect)frameRect
{
    self=[super initWithFrame: frameRect];
     if(self)
    {
        // here i dra some random curves to the view
        NSPoint p1,p2;
        srandom((unsigned int)time(NULL));
        path=[NSBezierPath bezierPath];
        [path setLineWidth: 3.0];
        p1=[self randomPoint];
        [path moveToPoint: p1];
        for(int i=0; i<15; i++)
        {
            p1=[self randomPoint];
            p2=[self randomPoint];
            [path curveToPoint: [path currentPoint] controlPoint1: p1 controlPoint2: p2 ];
            [path moveToPoint: p1];
        }
        [path closePath];
    }
    return self;
}

- (NSPoint) randomPoint
{
    NSPoint result;
    NSRect r=[self bounds];
    result.x=r.origin.x+random()%(int)r.size.width;
    result.y=r.origin.y+random()%(int)r.size.height;
    return result;
}

@end

質問:

1) ボタンが消えて再表示されるのはなぜですか? また、この問題を回避するにはどうすればよいですか?
2) 曲線が白で塗りつぶされているのはなぜですか? 塗りつぶしではなく、小さな線として描きたかったのです。

4

1 に答える 1

1

パート1:

スクロール ビューのスクロール バーが、ビューが実際にスクロールされる位置に更新されていないように見えます。(起動時に、スクロールバーが上部にある場合でも、ビューがすでに左下にスクロールされているように見えます)。

今のところ、あなたが実行しているOSは何ですか? コードを正しく複製しない限り、Mountain Lion で完璧に動作します。


パート2:

[path fill]drawRect で使用したため、パスが塗りつぶされます。[path stroke]代わりに、ストロークに使用します。

于 2012-08-03T16:59:25.257 に答える