drawRect не рисует NSImage

У меня есть собственный NSView

.h-файл

#import <Cocoa/Cocoa.h>

@interface CustomView : NSView

@property BOOL shallDraw;

- (void) setTheShallDraw:(BOOL)draw;

@end

.m-файл

#import "CustomView.h"

@implementation CustomView


- (id) initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code here.
        _shallDraw = NO;


    }
    return self;
}

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

    // Drawing code here.


    if (_shallDraw) {

        NSLog(@"Drawing image");
        NSString * file = @"/Users/mac2/Desktop/Test 1.jpg";
        NSImage * image = [[NSImage alloc] initWithContentsOfFile:file];

        if (image) {
            NSLog(@"Image initialized");
        }

        [image setFlipped:NO];

        NSSize customViewSize = NSMakeSize(self.bounds.size.width, self.bounds.size.height);
        NSRect myRect = NSMakeRect(20, 20, customViewSize.height *5/7, customViewSize.height);

        // Set Image Size to Rect Size
        [image setSize:myRect.size];

        // Draw Image in Rect
        [image drawInRect: myRect
                     fromRect: NSZeroRect
                    operation: NSCompositeSourceOver
                     fraction: 1.0];
    }



}

- (void) setTheShallDraw:(BOOL)draw{
    _shallDraw = draw;
    NSLog(@"Method 1 called");
    [self setNeedsDisplay:YES];
}

и класс контроллера

.час

#import <Foundation/Foundation.h>
#import "CustomView.h"

@interface Controller : NSObject
- (IBAction)goButton:(id)sender;
@end

.m

#import "Controller.h"

@implementation Controller
- (IBAction)goButton:(id)sender {

    CustomView *cv = [[CustomView alloc]init];
    [cv setTheShallDraw:YES];

}

@end

Теперь я хочу вызвать setTheShallDraw NSView из моего контроллера, чтобы отобразить NSImage в прямоугольнике.

Моя проблема в том, что, хотя вызывается метод setTheShallDraw, метод drawRect не рисует изображение. Что именно мне не хватает?

Это всего лишь экспериментальный проект, он мне нужен для более сложного проекта, включающего составные изображения, поэтому простое использование NSImageView в IB не поможет.

2 ответа

В своем коде вы не добавляете свой экземпляр CustomView в иерархию представлений...

- (IBAction)goButton:(id)sender {

    CustomView *cv = [[CustomView alloc]init];

    // add CustomView to view hierarchy
    [theContentView addSubview:cv];

    [cv setTheShallDraw:YES];
}

drawRect: вызывается до звонка [cv setTheShallDraw:YES]; случается.

Следовательно в initWithFrame: _shallDraw = NO; ограничивает рисовать как у вас:

 if (_shallDraw) {
    NSLog(@"Drawing image");
Другие вопросы по тегам