Рисование прозрачного NSImage делает все NSView прозрачными - PullRequest
1 голос
/ 28 января 2011

У меня есть три NSViews в приложении Какао, каждое подпредставление другого.

FirstNSView -> SecondNSView -> ThirdNSView

FirstNSView рисует сплошную фоновую заливку с использованием базовой графики.

SecondNSView - это контейнерное представление для ряда других представлений.

ThirdNSView рисует NSImage в свой кадр, используя следующий код в drawRect:

[img drawAtPoint:NSMakePoint(0, 0) fromRect:NSMakeRect(0, 0, img.size.width, img.size.height) operation:NSCompositeDestinationAtop fraction:1.0];

Я использую NSCompositeDestinationAtop, потому что это позволяет изображению почти действовать как маска для непрозрачной области img.

Однако прозрачные области img делают все окно прозрачным, вместо того, чтобы показывать это FirstNSView, как я и ожидал. Вот так:

enter image description here

Обратите внимание, что эксперименты с другими составными типами все еще приводят к этой же проблеме.

Я много читал о том, что NSView не предназначены для «наслоения», но я не уверен, что это уместно здесь. До сих пор я хорошо рисовал, используя Core Graphics на NSView и прозрачных секциях, обнажая слой «позади». Эта проблема возникла только при попытке составить это изображение.

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

1 Ответ

0 голосов
/ 28 января 2011
[img drawAtPoint:NSMakePoint(0, 0) fromRect:NSMakeRect(0, 0, img.size.width, img.size.height) operation:NSCompositeDestinationAtop fraction:1.0];

Я использую NSCompositeDestinationAtop, потому что это позволяет изображению почти действовать как маска для непрозрачной области img.

Какое изображение? Если вы хотите использовать альфа-канал img в качестве маски, то это NSCompositeSourceOver.

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

Однако прозрачные области img делают все окно прозрачным, вместо того, чтобы показывать это FirstNSView, как я и ожидал. Вот так:

[скриншот]

Я ничего не могу сказать по этому скриншоту. Для меня это выглядит как куча разноцветных фигур.

Я много читал о том, что NSView не предназначены для «наслоения», но я не уверен, что это уместно здесь.

Это не так. Перекрывающиеся родственные представления вызывают проблемы.

...