2012-06-09 1 views
5

Итак, я довольно новичок в AppKit и Cocoa (от UIKit с CocoaTouch), и в настоящее время я реализую интерфейс для сбрасывания NSWindow. На iOS это было бы довольно легко, но, видя, как много разных отличий от OS X, я хочу спросить.«Сгиб» NSWindow с использованием CoreAnimation

Как бы вы реализовали следующий переход?

Window Fold

Примечание: Нижняя полоса является частью моей contentView, а не нижнюю панель OS X обеспечивает. То есть мое окно (INAppStoreWindow кстати) состоит из titleBar и contentView.

Я думаю, что я мог бы просто свернуть содержимоеViewView и изменить размер окна синхронно, но было бы предпочтительнее, если бы я смог сохранить прозрачность во время складывания, что происходит из-за перспективы трансфокации. То есть стороны, которые изогнуты внутрь, должны (во время перехода) быть прозрачными. Или я переусердствую это?

ответ

2

Плохие новости: в отличие от UIKit, AppKit не использует Core Animation для визуализации своих элементов управления. Все CALayers заселяют свой мир в специальных экземплярах NSView для размещения на уровне сайтов. Поэтому, если просмотр содержимого вашего окна не является хостингом на уровне, вы не можете применять CAAnimations к содержимому вашего окна в целом без достаточной степени хакерства (возможно, можно отобразить весь контентный растровый рисунок, установите это как содержимое слоя и выполните преобразование на этом. Я не уверен).

Надеюсь, ваш контентный контент Core Core основан на анимации. Если да, то описанный вами подход должен работать. Вы также должны иметь возможность размещать слой в прозрачном без полей NSWindow, а затем любые преобразования, которые вы делаете в представлении контента, будут отображаться на рабочем столе позади него. Вот отрывок (от Matt Long), которые должны делать то, что вы хотите:

- (id) initWithContentRect: (NSRect) contentRect 
       styleMask: (unsigned int) aStyle 
        backing: (NSBackingStoreType) bufferingType 
        defer: (BOOL) flag 
{ 
    if (![super initWithContentRect: contentRect 
          styleMask: NSBorderlessWindowMask 
          backing: bufferingType 
         defer: flag]) return nil; 
    [self setBackgroundColor: [NSColor clearColor]]; 
    [self setOpaque:NO]; 

    return self; 
} 
+0

Да мой взгляд содержания основан CoreAnimation, и я знаю, что западня. Проблема с NSBorderlessWindowMask заключается в том, что если я установил цвет фона для clearColor, система сделает тень окна. Конечно, я мог бы просто пойти дальше и сделать свой собственный, но это было бы похоже на то, чтобы полностью рисовать собственное окно. Я бы хотел избежать этого из-за возможного изменения интерфейса в более поздних версиях OS X. – pkluz

+0

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