заставка какао привет мир - PullRequest
1 голос
/ 17 марта 2010

Я изучал NSView, и поэтому я решил сделать снимок заставки. Мне удалось отобразить и отобразить изображение в NSView, но я не вижу возможности изменить этот пример кода для отображения простой картинки в ScreenSaverView.

http://www.mactech.com/articles/mactech/Vol.20/20.06/ScreenSaversInCocoa/

Кстати, отличный учебник, который работает со Snow Leopard.

Я бы подумал, что для простого отображения изображения мне нужно что-то похожее на это ...

Что я делаю не так?

//
//  try_screensaverView.m
//  try screensaver
//

#import "try_screensaverView.h"

@implementation try_screensaverView

- (id)initWithFrame:(NSRect)frame isPreview:(BOOL)isPreview
{
    self = [super initWithFrame:frame isPreview:isPreview];
    if (self) {
        [self setAnimationTimeInterval:1]; //refresh once per sec
    }
    return self;
}

- (void)startAnimation
{
    [super startAnimation];

    NSString *path = [[NSBundle mainBundle] pathForResource:@"leaf" ofType:@"JPG" inDirectory:@""];
    image = [[NSImage alloc] initWithContentsOfFile:path];
}

- (void)stopAnimation
{
    [super stopAnimation];
}

- (void)drawRect:(NSRect)rect
{
    [super drawRect:rect];
}

- (void)animateOneFrame
{
    //////////////////////////////////////////////////////////
    //load image and display  This does not scale the image

    NSRect bounds = [self bounds];
    NSSize newSize;
    newSize.width = bounds.size.width;
    newSize.height = bounds.size.height;
    [image setSize:newSize];
    NSRect imageRect;
    imageRect.origin = NSZeroPoint;
    imageRect.size = [image size];
    NSRect drawingRect = imageRect;
    [image drawInRect:drawingRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1];
}

- (BOOL)hasConfigureSheet
{
    return NO;
}

- (NSWindow*)configureSheet
{
    return nil;
}

@end

Ответы [ 3 ]

2 голосов
/ 13 мая 2012

У меня была похожая проблема, поэтому я опубликую свое решение. OP пытался загрузить содержимое изображения через mainBundle NSBundle. Вместо этого вам больше повезет, если вы получите пакет скринсейвера и загрузите оттуда файлы, например:

NSBundle *saverBundle = [NSBundle bundleForClass:[self class]];
NSImage *image = [[NSImage alloc] initWithContentsOfFile:[saverBundle pathForResource:@"image" ofType:@"png"]];
2 голосов
/ 17 марта 2010
NSRect bounds = [self bounds];
NSSize newSize;
newSize.width = bounds.size.width;
newSize.height = bounds.size.height;
[image setSize:newSize];

Я не знаю, зачем ты это делаешь.

NSRect imageRect;
imageRect.origin = NSZeroPoint;
imageRect.size = [image size];

A.k.a. [self bounds].size.

NSRect drawingRect = imageRect;
[image drawInRect:drawingRect fromRect:imageRect operation:NSCompositeSourceOver fraction:1];

т.е. [image drawInRect:[self bounds] fromRect:[self bounds] operation:NSCompositeSourceOver fraction:1].

Если вы пытаетесь нарисовать изображение в его естественном размере, нет никаких оснований когда-либо отправлять ему сообщение setSize:. Вырежьте всю первую часть, а остальное должно работать нормально.

Если вы пытаетесь заполнить экран (который будет масштабироваться, что будет противоречить комментарию), установите drawingRect на [self bounds], а не imageRect. Это в точности так, как написано:

image,
    draw into (the bounds of the view),
    from (the image's entire area).

[image
    drawInRect:[self bounds]
      fromRect:imageRect
              ⋮
];

Ни отрисовка с фиксированным положением в натуральном размере, ни отрисовка на весь экран не являются эффективной заставкой. Последний не подлежит возврату; Вы можете сделать первое полезным, анимируя изображение вокруг экрана.

0 голосов
/ 07 мая 2012

Поскольку вы рисуете в animateOneFrame, попробуйте удалить переопределенный drawRect.

...