NSWindow: альтернатива -setOpaque: НЕТ - PullRequest
0 голосов
/ 26 февраля 2012

Я хочу иметь окно, похожее на окно QuickTime X.Полностью непрозрачное окно с закругленными углами.

Я получил его, реализуя пользовательский NSWindow без полей с:

[window setOpaque:NO];
[window setBackgroundColor: [NSColor clearColor]];

и пользовательский NSView с:

- (void)drawRect:(NSRect)rect
{
    NSBezierPath* thePath = [NSBezierPath bezierPath];
    [thePath appendBezierPathWithRoundedRect:rect xRadius:radius yRadius:radius];
    [thePath fill];
}

Это работает, как и ожидалось, но окно становится заметно медленным, когда оно быстро изменяется.

Я определил, что это замедление задается -setOpaque:NO;если я уберу эту строку, окно снова можно будет быстро изменить, но углы, очевидно, больше не будут закругленными.

Есть ли способ избежать использования -setOpaque:NO и при этом иметь закругленные углы?Может быть, у вас может быть окно, которое все непрозрачно, кроме углов?

Представление - NSOpenGLView, поэтому я могу использовать OpenGL, если это поможет.

Ответы [ 3 ]

0 голосов
/ 23 мая 2012
0 голосов
/ 08 апреля 2014

В Quartz / Core Graphics непрозрачные канаты быстрее составляются, чем непрозрачные канаты. Но непрозрачное окно означает, что вам нужно нарисовать прямоугольник, и все, что вы не заполните, будет черным.

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

Во всяком случае, это почти наверняка, а не ваше основное узкое место.

Во-первых, нужно перестать делать так много вещей в drawRect: Сделайте это NSBezierPath свойством. Заменяйте его только тогда, когда прямоугольник действительно меняет размер. Делайте это только в viewWillDraw: или в более ранней точке. Может быть, одно из представлений или окон изменяет размер NSNotifications или метод делегата.

В drawRect: вы должны делать только рисование на самом деле, насколько это возможно. Вы должны перерисовывать только то, что вам нужно, насколько это возможно.

Это все еще мало, и, вероятно, не ваше узкое место. Вам нужно будет изучить чертеж во ВСЕХ видах в вашем окне.

Ваше окно действительно является корневым CGContext (контекст рисования), к которому вы получаете доступ в OS X. Все в вашем контексте - это все ваши подпредставления. Каждое подпредставление является потенциальным узким местом рисования.

Рисунок вида OpenGL при изменении размера окна в реальном времени звучит как основной кандидат. Вы можете регулировать частоту кадров или что-то во время изменения размера вида или окна. Это должно стать немного острее.

Кроме того, из классов NSWindow и NSView вы заметите, что отсутствие рисования при изменении размера в реальном времени является выигрышем в производительности.

См. Документацию класса NSView и, в частности, методы, указанные в разделе Управление изменением размера в реальном времени

  • inLiveResize
  • preservesContentDuringLiveResize
  • getRectsExposedDuringLiveResize: Кол-во:
  • rectPreservedDuringLiveResize
  • viewWillStartLiveResize
  • viewDidEndLiveResize

Эти последние два выглядят как отличное место для небольшого сокращения рисунка,

0 голосов
/ 29 февраля 2012

Попробуйте использовать метод setAlphaValue NSWindow.

...