NSView и NSScrollView: кнопка, которая исчезает и снова появляется в другой позиции

Я нахожусь в 17-й главе программирования Аарона какао для Mac os X, и в этом примере он встраивает NSView в NSScrollView.
Для упражнения я также программно добавил 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) Почему кривые закрашены белым? Я хотел нарисовать их крошечными линиями, а не заливкой.


person Ramy Al Zuhouri    schedule 03.08.2012    source источник


Ответы (1)


Часть 1:

Похоже, что представление прокрутки не обновляет свои полосы прокрутки до того места, где оно фактически прокручивается. (При запуске кажется, что это показывает, что представление уже прокручено до нижнего левого угла, даже когда полоса прокрутки находится вверху).

На данный момент я могу только спросить, на какой ОС вы работаете? У меня он отлично работает на Mountain Lion, если я не продублировал ваш код правильно.


Часть 2:

Пути заполнены, потому что вы использовали [path fill] в drawRect. Вместо этого используйте [path stroke] для штрихов.

person Vervious    schedule 03.08.2012
comment
У вас может быть та же проблема, что и у stackoverflow.com/questions/8689601/, и это может быть ошибкой в ​​Lion. - person Vervious; 03.08.2012
comment
Вы правы, я только что изменил размер рамки и высоту окна и больше не испытывал этой проблемы. - person Ramy Al Zuhouri; 03.08.2012