2012-06-09 26 views
5

Vì vậy, tôi khá mới đối với AppKit và Cocoa (đến từ UIKit với CocoaTouch) và tôi hiện đang triển khai giao diện để gấp một NSWindow. Trên iOS, điều này sẽ khá dễ dàng nhưng nhìn thấy có nhiều sự khác biệt nhỏ với OS X mà tôi chọn hỏi."Gấp" một NSWindow sử dụng CoreAnimation

Bạn sẽ thực hiện quá trình chuyển đổi sau đây như thế nào?

Window Fold

Note: Thanh chốt là một phần của contentView của tôi và không thanh dưới cùng OS X cung cấp. I E. cửa sổ của tôi (INAppStoreWindow bằng cách này) bao gồm titleBar và contentView.

Tôi đoán tôi chỉ có thể gấp nội dungView và thay đổi kích thước cửa sổ đồng bộ nhưng sẽ thích hợp hơn nếu tôi có thể bảo toàn độ trong suốt trong khi gấp xảy ra do sự chuyển giao phối cảnh. I E. các bên bị cong vào trong nên (trong quá trình chuyển đổi) phải trong suốt. Hay tôi đang suy nghĩ về điều này?

Trả lời

2

Tin xấu trước tiên: không giống như UIKit, AppKit không sử dụng Core Animation để hiển thị các điều khiển của nó. Tất cả các CALayers sống trong thế giới riêng của họ trong các trường hợp lưu trữ lớp đặc biệt của NSView. Vì vậy, trừ khi chế độ xem nội dung của cửa sổ của bạn là lưu trữ lớp, bạn không thể áp dụng CAAnimations cho nội dung của cửa sổ mà không có mức độ công bằng của hackery (có thể hiển thị toàn bộ chế độ xem nội dung thành bitmap) thiết lập đó là nội dung của một lớp và thực hiện phép biến đổi trên đó. Tôi không chắc chắn).

Hy vọng rằng chế độ xem nội dung của bạn là dựa trên Hoạt ảnh dựa trên lõi. Nếu vậy, cách tiếp cận bạn mô tả sẽ hoạt động. Bạn cũng có thể lưu trữ các lớp trong một không biên giới trong suốt, NSWindow và sau đó bất kỳ biến đổi bạn thực hiện để xem nội dung sẽ tiết lộ các máy tính để bàn phía sau nó. Dưới đây là một đoạn trích (từ Matt Long) mà nên làm những gì bạn muốn:

- (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

Có chế độ xem nội dung của tôi là CoreAnimation, và tôi biết điều đó. Vấn đề với NSBorderlessWindowMask là nếu tôi thiết lập màu nền là clearColor hệ thống sẽ vẽ một bóng cửa sổ. Chắc chắn tôi chỉ có thể đi trước và làm của riêng tôi nhưng về cơ bản giống như vẽ cửa sổ của riêng tôi hoàn toàn. Tôi muốn tránh điều đó do sự thay đổi tiềm năng của giao diện trong các phiên bản sau của OS X. – pkluz

+0

Vấn đề của bạn với bóng cửa sổ khá giống với vấn đề điều khiển tiêu chuẩn. AppKit không được hiển thị bởi hoạt ảnh chính, vì vậy mọi thứ nó hiển thị bạn không thể sử dụng hoạt ảnh lõi. Bạn phải làm mà không có nó hoặc tự mình thực hiện lại. Nó hút, tôi biết. Tôi đoán nó chỉ là một phần của hành lý đi kèm với việc làm việc trên một api cũ hơn ... –

Các vấn đề liên quan