2010-03-17 134 views
1

我一直在研究NSView,因此我想我會給屏幕保護程序一個鏡頭。我已經能夠在NSView中顯示和圖像,但我無法看到修改此示例代碼以在ScreenSaverView中顯示簡單的圖片。可可你好世界屏保

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

BTW偉大的教程,與雪豹的工作。

我想簡單地顯示圖像,我需要的東西,看起來像這樣...

我在做什麼錯?

// 
// 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 
+1

它代替什麼? (順便說一下,你正在泄漏圖像,釋放物體(對於非GC),並將伊娃設置爲零(用於GC)來修復泄漏。) – 2010-03-17 07:24:13

回答

2
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]; 

又名[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

這很好,但它仍然不起作用。我應該在啓動動畫中加載圖像嗎? 你願意送我一個工作的.m文件嗎? 晚餐簡單.m文件 在此先感謝! – 2010-03-27 05:28:50

+0

您可能應該先載入圖像;我可能會在'initWithBundle:'中執行它。如果這樣做後它仍然不起作用,那麼你將需要定義「不起作用」。 – 2010-03-27 08:50:48

0

由於您正在使用animateOneFrame進行繪圖,請嘗試移除您覆蓋的drawRect

2

我有類似的問題,所以我會發布我的解決方案。 OP試圖通過NSBundle的mainBundle加載圖像內容。相反,你會有更多的運氣提取屏幕保護程序的捆綁軟件並從那裏加載文件,如下所示:

NSBundle *saverBundle = [NSBundle bundleForClass:[self class]]; 
NSImage *image = [[NSImage alloc] initWithContentsOfFile:[saverBundle pathForResource:@"image" ofType:@"png"]];