2012-02-27 25 views
6

Có an toàn để có được CGContext của NSView từ -drawRect: và sử dụng nó để sau đó thực hiện thêm bản vẽ? Trong một thử nghiệm đơn giản như thế này:Ngữ cảnh Bản vẽ của NSView

CGContextRef context = NULL; 

- (void)drawRect:(NSRect)r 
{ 
    if (!context) 
     context = [[NSGraphicsContext currentContext] graphicsPort]; 
} 

- (void)drawSomething 
{ 
    CGContextSetRGBFillColor(context, 1, 0, 0, 1); 
    CGContextFillRect(context, CGRectMake (0, 0, 100, 100)); 
    CGContextFlush(context); 
} 

mọi thứ dường như hoạt động khi -drawSomething được gọi, nhưng đảm bảo rằng ngữ cảnh sẽ không thay đổi?

Như bạn có thể thấy và có thể đoán, tôi đang cố gắng bỏ qua cách vẽ tiêu chuẩn bằng cách sử dụng -drawRect:. Nó hoạt động độc đáo vô số lần, nhưng một cách vẽ thủ tục hơn sẽ làm cho cuộc sống dễ dàng hơn trong trường hợp cụ thể của tôi.

Trả lời

6

Bạn không nên làm điều này. Ngữ cảnh không được bảo đảm tồn tại bên ngoài drawRect: và thực tế là mã vẽ của bạn đang hoạt động là một tai nạn hạnh phúc. Đừng dựa vào hành vi này.

Nếu bạn cần bắt buộc vẽ bất kỳ lúc nào, bạn nên gọi display trên chế độ xem, lần lượt sẽ gọi drawRect:.

2

Bạn cần phải sử dụng lockFocus: nếu bạn muốn vẽ bên ngoài drawRect: Dưới đây là đoạn trích từ tài liệu của NSView:

Nếu bạn không sử dụng một màn hình ... phương pháp để vẽ một đối tượng NSView, bạn phải gọi lockFocus trước khi gọi các phương thức gửi lệnh đến máy chủ cửa sổ và phải cân bằng nó bằng tin nhắn unlockFocus khi hoàn tất.

Ẩn hoặc thu nhỏ cửa sổ một lần khiến cửa hàng sao lưu cho cửa sổ đó sẽ được giải phóng. Nếu bạn không sử dụng cơ chế hiển thị tiêu chuẩn để vẽ, bạn nên sử dụng lockFocusIfCanDraw thay vì lockFocus nếu có cơ hội vẽ trong khi cửa sổ là thu nhỏ hoặc ẩn.

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