2016-08-14 3 views
1

Я пытаюсь добавить тень к NSImageView в приложении MAC.Objective C - OS X - Проблема добавляет NSShadow в NSImageView

Я создал пользовательский NSImageView класс "ShadowView.h" и модифицировал DrawRect: как так:

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

    NSShadow *shadow = [[NSShadow alloc] init]; 
    [shadow setShadowBlurRadius:5]; 
    [shadow setShadowOffset:NSMakeSize(30.0, 3.0)]; 
    [shadow setShadowColor:[NSColor redColor]]; 
    [shadow set]; 

    [self setWantsLayer:YES]; 
    [self setShadow:shadow]; 
} 

Однако ничего не происходит. Кроме того, когда я отлаживаю, я вижу, как вызывается указанный выше код. Я посмотрел на этот вопрос от 5 лет назад, но это, кажется, больше не работает

Adding a Shadow to a NSImageView

Спасибо!

+0

SuperView ваш взгляд также включили ли слой-подложка? Я создал быстрое тестовое приложение с этим кодом, и если у супервизора _also_ нет поддержки слоя, тень будет обрезана на границе границ обзора. Возможно, есть тень, но она находится вне вашего изображения, и у супервизора нет слоя? – Arclite

+0

Кроме того, и это может быть глупый вопрос, есть ли у вас образ на изображении? Тень для «NSImageView» рассчитывается на основе альфа-изображения, поэтому, если нет изображения, тени нет. – Arclite

+0

@Arclite Проблема заключалась в том, что у моего супервизора не было поддержки слоя! Я просто добавил [self.view хочетLayer: YES] к моему viewController viewDidLoad. Если вы дадите ему ответ, я могу принять его как правильно. Спасибо. –

ответ

1

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

clipped shadow

Убедитесь, что вы звоните -setWantsLayer:YES на надтаблицы вашей точки зрения (или проверить «Core Animation Layer» флажок в Interface Builder) для того, чтобы убедиться, что тень полностью видна:

full shadow

0

Вы должны установить их где-нибудь еще в этом роде, initWithFrame: взять их из DrawRect:

[self setWantsLayer:YES]; 
[self setShadow:shadow]; 
Смежные вопросы