2014-10-03 2 views
1

Я пытаюсь следовать за Quartz 2D programming guide с помощью RubyMotion.RubyMotion: пытается следовать руководству по программированию 2D кварца для Mac

Вот мой AppDelegate:

class AppDelegate 
    def applicationDidFinishLaunching(notification) 
    buildMenu 
    buildWindow 
    end 

    def buildWindow 
    @window = NSWindow.alloc.initWithContentRect([[240, 180], [480, 360]], 
     styleMask: NSTitledWindowMask|NSClosableWindowMask|NSMiniaturizableWindowMask|NSResizableWindowMask, 
     backing: NSBackingStoreBuffered, 
     defer: false) 
    @window.title = NSBundle.mainBundle.infoDictionary['CFBundleName'] 
    @window.orderFrontRegardless 

    @view = MyQuartzView.alloc.initWithFrame(@window.frame) 
    @window.contentView.addSubview @view 
    end 
end 

А вот мой MyQuartzView, который должен быть прямой перевод из кода в руководстве:

class MyQuartzView < NSView 
    def drawRect(rect) 
    myContext = NSGraphicsContext.currentContext.graphicsPort 
    CGContextSetRGBFillColor(myContext, 1, 0, 0, 1) 
    CGContextFillRect(myContext, CGRectMake(0, 0, 200, 100)) 
    CGContextSetRGBFillColor(myContext, 0, 0, 1, 0.5) 
    CGContextFillRect(myContext, CGRectMake(0, 0, 100, 200)) 
    end 
end 

Я получаю следующие ошибки:

<Error>: CGContextSetRGBFillColor: invalid context 0x10222bad0 
<Error>: CGContextFillRects: invalid context 0x10222bad0 
<Error>: CGContextSetRGBFillColor: invalid context 0x10222bad0 
<Error>: CGContextFillRects: invalid context 0x10222bad0 

Почему этот контекст недействителен? Я внутри drawRect метод.

EDIT Если изменить окно прямоугольник на [[340, 380], [480, 360]] ошибка уходит, но drawRect не называется. Однако, когда я изменяю размер окна, он вызывается с одинаковыми ошибками.

EDIT 2 Это приложение OS X.

EDIT 3 Интересно, та же программа в Objective-C работает отлично:

// main.m 
#import <Cocoa/Cocoa.h> 
#import "MyQuartzView.h" 

int main(int argc, const char * argv[]) 
{ 
    NSApplication *app = [NSApplication sharedApplication]; 
    NSRect frame = NSMakeRect(100., 100., 300., 300.); 

    NSWindow *window = [[NSWindow alloc] 
     initWithContentRect: frame 
        styleMask: NSTitledWindowMask | NSClosableWindowMask 
        backing: NSBackingStoreBuffered 
         defer: false]; 

    [window setTitle: @"Test"]; 

    id view = [[MyQuartzView alloc] initWithFrame: frame]; 
    [window setContentView: view]; 
    [window setDelegate: view]; 
    [window orderFrontRegardless]; 

    [app run]; 

    return EXIT_SUCCESS; 
} 

// MyQuartzView.m 
#import "MyQuartzView.h" 

@implementation MyQuartzView 

- (id)initWithFrame:(NSRect)frame 
{ 
    return[super initWithFrame:frame]; 
} 

- (void)drawRect:(NSRect)dirtyRect 
{ 
    CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort]; 
    CGContextSetRGBFillColor (myContext, 1, 0, 0, 1); 
    CGContextFillRect (myContext, CGRectMake (0, 0, 200, 100)); 
    CGContextSetRGBFillColor (myContext, 0, 0, 1, .5); 
    CGContextFillRect (myContext, CGRectMake (0, 0, 100, 200)); 
} 

@end 
+0

Вы планируете создать 2 заполненных прямоугольника. которые перекрывают друг друга? –

+0

@ rahul_send89, да, но если я смогу нарисовать хотя бы один прямоугольник - это будет прорыв. Я пытаюсь следовать этому руководству: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html – Halst

+0

если я добавлю ответ на то же самое .. пожалуйста, t проголосовать. Пинг меня, если он не работает. изменится или изменится. звук хороший? –

ответ

1

Вот волшебство, чтобы сделать его работу: Вам необходимо позвонить to_object, когда вы получите контекст:

myContext = NSGraphicsContext.currentContext.graphicsPort.to_object 

Я реализовал свой код в проекте RubyMotion, и это был результат:

enter image description here

+0

Большое спасибо! Что это за метод '# to_object'? документация об этом – Halst

+0

Я не видел документацию для 'to_object'. Я понял это, посмотрев официальные образцы кода OS X. В частности,' PathDemo': https://github.com/HipByte/RubyMotionSamples/tree/ ведущий/OSX – vacawama