NSView和NSScrollView:按钮消失并重新出现在另一个位置

时间:2012-08-03 16:15:05

标签: objective-c macos nsview nsscrollview

我是Aaron针对Mac OS X的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)为什么曲线填充为白色?我想把它们画成细线,而不是填充。

1 个答案:

答案 0 :(得分:1)

第1部分:

它看起来是滚动视图没有将其滚动条更新到实际滚动视图的位置。 (在启动时,它似乎显示视图已向下滚动到左下角,即使滚动条位于顶部)。

我现在只能问,你在运行什么操作系统?除非我没有正确复制你的代码,否则它对我来说非常适合Mountain Lion。


第2部分:

路径已填满,因为您在drawRect中使用了[path fill]。使用[path stroke]代替笔画。