2012-06-16 17 views
15

Với ứng dụng Cocoa chạy trên Mac OS X 10.7 trở lên:Mac OS X: Cách tốt nhất để thực hiện kiểm tra thời gian chạy cho màn hình hiển thị võng mạc?

Cách tốt nhất để kiểm tra, khi chạy, nếu ứng dụng của bạn hiện đang chạy trên máy Mac có ít nhất một màn hình võng mạc được đính kèm?

Nếu kiểm tra loại điều này thực sự là sai lầm, tôi hoàn toàn hoan nghênh một lời giải thích hợp lý về lý do tại sao (và tôi sẽ bỏ phiếu bình chọn nếu chúng tốt).

Nhưng tôi vẫn muốn biết :). Có vẻ như bạn chỉ có thể thực hiện kiểm tra cụ thể cho phần mềm Mac Book Pro mới "Retina" (máy Mac duy nhất hiện có màn hình võng mạc), nhưng tôi thực sự thích một tổng quát hơn/chung/tương lai- bằng chứng để kiểm tra hơn thế này.

Lý tưởng nhất, tôi muốn biết cách phát hiện màn hình hiển thị võng mạc, không phải kiểu máy Mac cụ thể hiện đang diễn ra với màn hình võng mạc.

Trả lời

31

Nếu bạn thực sự cần làm điều này, hãy xem -[NSScreen backingScaleFactor]. Nhưng, điều này có vẻ sai lầm, ít nhất là không biết thêm về lý do tại sao bạn muốn biết.

Trong khi hiện chỉ có một máy Mac có màn hình Retina, cuối cùng có thể có màn hình độc lập hỗ trợ Retina (và có thể được gắn/tháo rời khi chạy) và bạn có thể cấu hình màn hình Retina tích hợp trong 1x chế độ. Vì vậy, câu trả lời cho câu hỏi "là có một màn hình Retina kèm theo" có thể thay đổi bất cứ lúc nào.

Thay vào đó, bạn có thể muốn biết liệu nội dung của mình có nên được vẽ bằng một phương thức nhất định hay không bằng cách sử dụng phương thức -convert*ToBacking: hoặc -[NSWindow backingScaleFactor]. Để biết thêm chi tiết, hãy xem video phiên WWDC 2012 "Mẹo và thủ thuật nâng cao cho độ phân giải cao trên OS X" (khi được đăng, hy vọng trong vài tuần tới).

+4

+1, OP cũng nên đọc [Hướng dẫn phân giải cao cho OS X] (https://developer.apple.com/library/mac/#documentation/GraphicsAnimation/Conceptual/HighResolutionOSX/Introduction/Introduction.html). –

+3

Nó không phải là sai lầm để làm điều đó. Các trang web hoàn toàn cần phải làm điều đó để cung cấp các tài nguyên chính xác cho iPad và iPhone ngay bây giờ, vậy tại sao nó lại khác nhau đối với các ứng dụng? Tất nhiên, bạn không thể thực hiện việc kiểm tra * thay vì * cho phép hệ điều hành thực hiện việc này trong trường hợp hoán đổi nội dung đơn giản (ví dụ: trường hợp @ 2x). :) –

+2

Trình duyệt web có thể cần phải tải xuống 2x hình ảnh nhưng chỉ khi cửa sổ trình duyệt hiển thị 2 lần ... có thể thay đổi bất kỳ lúc nào do những lý do đã nêu ở trên. – tjw

5

Vâng, trên iOS, bạn sử dụng thuộc tính UIScreen.scale. Nếu nó trả về 2.0, thì bạn đang sử dụng thiết bị có màn hình có độ phân giải cao. Nếu không, bạn đang sử dụng thiết bị có độ phân giải thấp.

Vì vậy, tôi tưởng tượng rằng trên Mac OS, bạn có thể sử dụng -[NSScreen backingScaleFactor] hoặc -[NSWindow backingScaleFactor].

+2

backingScaleFactor không phải là một phương pháp học. Vì vậy, nó phải là [[NSScreen mainScreen] backingScaleFactor] hoặc một trong các màn hình [NSScreen]. – erkanyildiz

+0

Hãy quên đi '- [NSScreen backingScaleFactor]', đúng cách để làm là điều chỉnh mã vẽ của bạn tùy thuộc vào yếu tố tỷ lệ của cửa sổ. Hệ thống chịu trách nhiệm xác định yếu tố tỷ lệ nào phù hợp với một cửa sổ cụ thể. –

+1

@MichaMazaheri: Đôi khi bạn không cần điều này để vẽ. Trong trường hợp của tôi, tôi lấy một ảnh chụp màn hình từ nhiều màn hình và sau đó bạn phải tính toán vị trí pixel chính xác. - [NSScreen backingScaleFactor] là con đường để đi. –

8

Tôi chỉ chạy vào một trường hợp mà tôi cần thiết để phát hiện nếu có màn hình là độ phân giải cao, điều này đã làm việc

float displayScale = 1; 
    if ([[NSScreen mainScreen] respondsToSelector:@selector(backingScaleFactor)]) { 
     NSArray *screens = [NSScreen screens]; 
     for (int i = 0; i < [screens count]; i++) { 
      float s = [[screens objectAtIndex:i] backingScaleFactor]; 
      if (s > displayScale) 
       displayScale = s; 
     } 
    } 
+4

Bạn biết về lặp lại nhanh như trong màn hình «NSScreen * trong [màn hình NSScreen])'? Tiết kiệm cho bạn rất nhiều đánh máy (và nhanh hơn trong thời gian chạy). – DarkDust

+0

vâng, cái này hoạt động! ngón tay cái lên! float displayScale = 1.0; nếu ([[NSScreen màn hình chính] respondsToSelector: @selector (backingScaleFactor)]) {cho (màn hình NSScreen * trong [màn hình NSScreen]) {float s = [screen backingScaleFactor]; if (s> displayScale) displayScale = s; }} NSLog (@ "displayScale =% f", displayScale); float x0 = displayScale * self.frame.origin.x; float y0 = displayScale * self.frame.origin.y; float w0 = displayScale * self.frame. float h0 = displayScale * self.frame.size.height; NSLog (@ "x =% f; y =% f; w =% f'h =% f", x0, y0, w0, h0) ; –

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