NSImageView рисует неправильно - PullRequest
0 голосов
/ 29 мая 2011

Я создал собственный подкласс NSView для управления 2 NSImageViews. Код для создания изображений выглядит следующим образом:

- (id)initWithFrame:(NSRect)frameRect AndMap:(NSImage *)map AndPlayer:(NSImage *)guyImage
{
    self = [super initWithFrame:frameRect];
    if (self)
    {
        NSRect newRect = NSMakeRect(0.0, 0.0, 64.0, 64.0);

        NSImageView *theMap = [[NSImageView alloc] initWithFrame:NSMakeRect(0.0, 0.0, frameRect.size.width, frameRect.size.height)];
        [theMap setImage:map];

        NSImageView *theGuy = [[NSImageView alloc] initWithFrame:newRect];
        [theGuy setImage:guyImage];

        [self setMapImage:theMap];
        [self setPlayerView:theGuy];
        [self addSubview:[self mapImage]];
        [self addSubview:[self playerView]];

Однако, когда я приказываю представлению рисовать в прямоугольнике с источником (128,0), оно рисует theMap со странными смещениями, так что theGuy origin на 128,0, но theMap происхождение находится в чем-то вроде (128,20). Я не могу найти причину, почему это должно происходить.

Ответы [ 2 ]

2 голосов
/ 29 мая 2011

Я предполагаю, что у вас есть перекрывающиеся друг с другом виды:

  • theMap имеет кадр {{0.0, 0.0}, {frameRect.size.width, frameRect.size.height}}
  • theGuy имеет кадр {{0.0, 0.0}, {64.0, 64.0}}
  • theMap и theGuy добавляются (или, кажется, добавляются) к одному и тому же суперпредставлению, а именно self, и имеют одинаковое происхождение.

Какао не гарантирует правильного поведения для перекрытияродственные виды, т. е. два вида, которые имеют одно и то же прямое суперпредставление и чьи соответствующие кадры перекрываются.Из View Руководство по программированию :

Примечание: По соображениям производительности, Какао не навязывает обрезку между одноуровневыми представлениями и не гарантирует правильную аннулирование и поведение при рисовании при одноуровневом взаимодействии.виды перекрываются.Если вы хотите, чтобы вид был нарисован перед другим видом, вы должны сделать вид спереди подпредставлением (или потомком) вида сзади.

Согласно этот ответ на другой вопросв переполнении стека одно альтернативное решение - включить слои для представлений.

0 голосов
/ 29 мая 2011

Подумайте - странные смещения карты не случайно являются частью карты NSImage?

...