2010-07-14 5 views
0

Im работает над представлением перетаскивания n 'и нашел некоторые обработчики для перетаскивания в Интернете. Я хочу сделать так, чтобы он стал синим, когда пользователь перетаскивает файл по области перетаскивания и снова серый, когда они выходят из области перетаскивания. Проблема заключается в том, что он не обновляется, когда вы наводите на него указатель мыши или выходите из него. Heres часть кода:NSView Не обновляется?

- (void)drawRect:(NSRect)rect 
{ 
    NSRect bounds = [self bounds]; 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:bounds]; 
} 

- (NSDragOperation)draggingEntered:(id <NSDraggingInfo>)sender { 
    NSRect bounds = [self bounds]; 
    [[NSColor blueColor] set]; 
    [NSBezierPath fillRect:bounds]; 

    return NSDragOperationCopy; 

}

- (void)draggingExited:(id <NSDraggingInfo>)sender { 
    NSRect bounds = [self bounds]; 
    [[NSColor grayColor] set]; 
    [NSBezierPath fillRect:bounds]; 

}

Спасибо за любую помощь.

ответ

1

Рисование работает только при создании контекста (например, холста для рисования) для рисования. Когда фреймворк вызывает -drawRect:, он настроил для вас контекст рисования, поэтому команды рисования, такие как -[NSColor set] и -[NSBezierPath fillRect:], работают так, как вы ожидаете.

За пределами -drawRect: обычно нет контекста рисования. Использование команд рисования за пределами -drawRect: похоже на размахивание кистью в воздухе; нет полотна, поэтому картина не происходит.

В 99,99% случаев весь вид чертежа должен храниться в пределах -drawRect:, поскольку NSView выполняет большую работу, которую вы не хотите делать, чтобы настроить контекст чертежа правильно и эффективно.

Итак, как вы меняете рисунок своего вида в своих методах -draggingEntered: и -draggingExited:? По побочным эффектам.

Вы делаете то же самое во всех трех случаях: 1) Установка цвета и 2) Нанесение прямоугольника. Единственное различие заключается в изменении цвета в каждом методе. Итак, почему бы не контролировать, какой цвет вы используете в -drawRect: с Ивар, например, так:

- (void)draggingEntered:(id <NSDraggingInfo>)sender { 
    drawBlueColorIvar = YES; 
    // ... 
} 

Тогда в -drawRect: вы делаете это:.

- (void)drawRect:(NSRect)rect { 
    NSColor *color = drawBlueColorIvar ? [NSColor blueColor] : [NSColor grayColor]; 
    [color set]; 
    [NSBezierPath fillRect:rect]; 
} 

(Обратите внимание, что я не использовал [self bounds] Это более эффективно просто втягивать в «грязный» рельс, когда это возможно.)

Наконец, вам нужно каким-то образом рассказать о структуре, которую необходимо изменить, при изменении drawBlueColorIvar. Рамки ничего не будут нарисовать, если это не будет сказано. Как сказал Крис Купер, вы делаете это с [self setNeedsDisplay:YES]. Это должно идти после любого места, которое вы меняете drawBlueColorIvar.

+0

Я все еще несколько новичок в какао и не слышал об иваре. Когда я пытаюсь скомпилировать, я получаю ошибку: «drawBlueColorIvar» uneclared (сначала использовать в этой функции), что кажется логичным, потому что я его не объявлял. Как объявить ivar? – nosedive25

+0

О, я получил его, я просто добавил NSColor * drawBlueColorIvar; к заголовку представления. Спасибо за помощь! – nosedive25

2

Вы звоните [yourView: setNeedsDisplay] в любом месте?

Вот как вы позволяете рамке рисования знать, что нужно сообщить свой UIView подкласс с drawRect:, поэтому вы должны делать это, когда что-то изменилось. В вашем случае это, вероятно, означает, что мышь входит или выходит из области перетаскивания.

+0

Я добавил [self setNeedsDisplay: YES]; после каждого из рисунков, но не повезло. Добавление nslog к ней показывает, что методы запускаются. – nosedive25