2011-01-08 4 views
9

Я создаю приложение, где мне нужно иметь прозрачный NSView с прозрачным PNG-изображением внутри. Проблема в том, что в NSView я рисую серый фон. Я имею это подклассы (как TransparentRectangleView), но не знаю, что положить в drawRect, чтобы сделать его прозрачным.Подкласс NSView, чтобы иметь прозрачный фон

Я уже переопределен метод Isopaque вернуть NO, но это не похоже, чтобы помочь ...

Кроме того, есть уже подклассы NSView, который похож на UIImageView на iPhone (как долго, как я могу добавьте subview внутри, мне нужно добавить текст внутри).

+1

не есть ползунок прозрачности в Interface Builder? Кажется, я помню, как случайно отверг непрозрачность одного из моих взглядов. –

+1

Я почти на 100% уверен, что устанавливает прозрачность всего вида, включая детей. Это означало бы, что все мои кнопки и текст также будут иметь непрозрачность 1% или что-то еще. Если я ошибаюсь, сообщите мне: D –

+1

Подождите, так что вам просто нужен прозрачный цвет фона? Я знаю, что для UIViews существует предопределенный прозрачный цвет, который вы можете использовать, хотя я не пробовал использовать его с NSView. –

ответ

16

Чтобы сделать прозрачный вид, просто заполните его с помощью [NSColor clearColor].

- (void)drawRect:(NSRect)rect { 
    [[NSColor clearColor] set]; 
    NSRectFill(rect); 
} 

Реализация по умолчанию Isopaque возвращает NO, так что если вы подклассов NSView, а не какой-либо другой вид вам не нужно беспокоиться о перекрывая его.

+0

Это очень полезно для будущего! Благодаря! –

+4

Кстати, я уверен, что если вы оставите 'drawRect:' empty, вы получите тот же эффект, так как вы ничего не рисуете. Разумный уверен = определенный, поскольку я делаю это часто. – d11wtq

+0

Ваш код рисует черный прямоугольник, если вы не установите, чтобы окно было непрозрачным (окно, а не представление! NSView по умолчанию непрозрачны, но NSWindow по умолчанию непрозрачны). См. Также этот текст http://www.drissman.com/blog/archives/2009/10/09/nsrectfill_and_nscolor_clearcolor.html. Так что вы хотите либо упомянуть об этом окне, либо использовать NSRectFillUsingOperation, как показано в тексте. О, он также будет работать, если ваше представление будет многослойным, так как в этом случае он имеет собственный слой рисования. – Mecki

10

Принятый ответ не работает для меня, так как мое окно непрозрачно. Как http://www.drissman.com/blog/archives/2009/10/09/nsrectfill_and_nscolor_clearcolor.html (и обсуждение ниже) говорит, следующие коды работают:

- (void)drawRect:(NSRect)rect { 
    [[NSColor clearColor] set]; 
    NSRectFillUsingOperation(rect, NSCompositeSourceOver); 
    // do other drawings 
} 
+1

SourceOver - это, по большей части, операция компоновки по умолчанию. Это ничем не отличается от '[NSBezierPath fillRect:]' и обе менее эффективны и менее эффективны, чем 'NSRectFill', который (необычно) использует' NSCopyCompositeOperation'.И, как говорит d11wtq о принятом ответе, это необязательно - само представление уже прозрачно, кроме случаев, когда вы рисуете иначе. –

+0

@PeterHosey Вы даже прочитали, что говорит текст по ссылке? Нет, это не то же самое. NSRectFill с прозрачным цветом будет работать, только если окно не было явно задано непрозрачным, что вы можете сделать, конечно, но оно тратит много времени на вычисления, если ваше окно фактически непрозрачно. NSRectFillUsingOperation будет работать правильно, если окно непрозрачно или нет. Текст по ссылке объясняет это очень красиво и просто сэкономил мне массу работы. – Mecki

0

Свифта версия:

override func draw(_ dirtyRect: NSRect) { 

    NSColor.clear.set() 
    dirtyRect.fill() 
}