Я пытаюсь следовать за 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
Вы планируете создать 2 заполненных прямоугольника. которые перекрывают друг друга? –
@ rahul_send89, да, но если я смогу нарисовать хотя бы один прямоугольник - это будет прорыв. Я пытаюсь следовать этому руководству: https://developer.apple.com/library/mac/documentation/GraphicsImaging/Conceptual/drawingwithquartz2d/dq_context/dq_context.html – Halst
если я добавлю ответ на то же самое .. пожалуйста, t проголосовать. Пинг меня, если он не работает. изменится или изменится. звук хороший? –