2010-04-17 21 views
6

HI there,Sử dụng màn hình UIScreen để điều khiển màn hình VGA - dường như không hiển thị UIWindow?

Tôi đang cố gắng sử dụng UIScreen để lái một màn hình riêng biệt với dongle VGA trên iPad của tôi.

Dưới đây là những gì tôi đã có trong viewDidLoad view controller gốc của tôi:

//Code to detect if an external display is connected to the iPad. 
NSLog(@"Number of screens: %d", [[UIScreen screens]count]); 

//Now, if there's an external screen, we need to find its modes, itereate through them and find the highest one. Once we have that mode, break out, and set the UIWindow. 

if([[UIScreen screens]count] > 1) //if there are more than 1 screens connected to the device 
{ 
    CGSize max; 
    UIScreenMode *maxScreenMode; 
    for(int i = 0; i < [[[[UIScreen screens] objectAtIndex:1] availableModes]count]; i++) 
    { 
    UIScreenMode *current = [[[[UIScreen screens]objectAtIndex:1]availableModes]objectAtIndex:i]; 
    if(current.size.width > max.width); 
    { 
    max = current.size; 
    maxScreenMode = current; 
    } 
    } 
    //Now we have the highest mode. Turn the external display to use that mode. 
    UIScreen *external = [[UIScreen screens] objectAtIndex:1]; 
    external.currentMode = maxScreenMode; 
    //Boom! Now the external display is set to the proper mode. We need to now set the screen of a new UIWindow to the external screen 
    external_disp = [externalDisplay alloc]; 
    external_disp.drawImage = drawViewController.drawImage; 
    UIWindow *newwindow = [UIWindow alloc]; 
    [newwindow addSubview:external_disp.view]; 
    newwindow.screen = external; 
} 
+1

iPad nào đặc biệt về điều này? Bạn có thể xuất ra màn hình ngoài trên iPhone không? – Ali

Trả lời

8

Bạn cần init cửa sổ của bạn ...

UIWindow *newwindow = [[UIWindow alloc] init]; 
+0

Cảm ơn bạn rất nhiều vì điều này!Điều này đã làm nó! Tôi không thể tin rằng tôi đã quên ... –

2

[newwindow makeKeyAndVisible];?

+1

Tôi đã thêm quyền này sau dòng cuối cùng và dường như vẫn làm điều tương tự. Thật thú vị, bởi vì tôi có thể nói (sử dụng màn hình của tôi) khi màn hình VGA đã được "xác nhận quyền sở hữu" bởi ứng dụng, điều tương tự cũng xảy ra khi Keynote được khởi chạy; màn hình sẽ không chuyển sang chế độ DVI hoặc chuyển sang chế độ ngủ. Có thể có sự cố với bộ điều khiển chế độ xem bên ngoài của tôi không? Nó khá lành tính, chỉ là một tập tin .xib với một UIImageView, không có gì phức tạp cả. Cảm ơn bạn đã đề xuất! –

+0

Tôi bây giờ có một cái nhìn hiển thị trên đầu ra VGA Thật không may, bất kỳ thay đổi nào với tham số drawImage của externalDisplay dường như không hoạt động. Tôi đã thêm IBOutlets khác hoạt động, nhưng không phải là drawImage (là một UIImageView). Bất kỳ ý tưởng? –

+0

Cảm ơn Noah - điều này thực sự là một phần của vấn đề của tôi, nhưng tôi quên để khởi tạo cửa sổ cũng. Cám ơn phản hồi của bạn! –

2

Tôi nghĩ vấn đề của bạn là externalDisplay. Tạo một viewcontroller bên ngoài mã của bạn (có thể làm một cách đơn giản Thêm tập tin mới ViewController và đặt công cụ trong .xib) và thử nó ra để đảm bảo rằng viewcontroller đang làm việc trước khi bạn gọi nó vào màn hình bên ngoài. Đây là mã của bạn với các thay đổi được đề xuất của tôi - [chế độ xem mainViewController] là bộ điều khiển xem mà bạn đã tạo bên ngoài.

//Code to detect if an external display is connected to the iPad. 
NSLog(@"Number of screens: %d", [[UIScreen screens]count]); 

//Now, if there's an external screen, we need to find its modes, iterate 
//through them and find the highest one. Once we have that mode, break out, 
//and set the UIWindow. 

if([[UIScreen screens]count] > 1) //if there are more than 1 screens connected 
            //to the device 
{ 
CGSize max; 
UIScreenMode *maxScreenMode; 
for(int i = 0; i < [[[[UIScreen screens] objectAtIndex:1] availableModes]count]; i++) 
{ 
    UIScreenMode *current = [[[[UIScreen screens]objectAtIndex:1]availableModes]objectAtIndex:i]; 
    if(current.size.width > max.width); 
    { 
    max = current.size; 
    maxScreenMode = current; 
    } 
} 
//Now we have the highest mode. Turn the external display to use that mode. 
UIScreen *external = [[UIScreen screens] objectAtIndex:1]; 
external.currentMode = maxScreenMode; 
//Boom! Now the external display is set to the proper mode. We need to now 
//set the screen of a new UIWindow to the external screen 

UIWindow *newwindow = [UIWindow alloc]; 

[newwindow addSubview:[mainViewController view]]; 
newwindow.screen = external; 

[newwindow makeKeyAndVisible]; 
[newwindow setHidden:NO]; 
} 
0

Nó cần phải được đề cập đến việc mã được cung cấp trên trang này và vào liên kết github bởi igaiga được chỉ đơn thuần có nghĩa là để "di chuyển" (KHÔNG clone) quan điểm cho rằng thông thường sẽ là trên iPad (hoặc thiết bị khác).

Nếu bạn cần sao chép (aka Mirror) quan điểm và làm mới nội dung của nó liên kết này là phù hợp hơn: http://www.touchcentric.com/blog/archives/123

Tôi hy vọng điều này giúp làm sáng tỏ các trường hợp sử dụng cho cả hai bộ mã cho người sử dụng chỉ mới bắt đầu để tích hợp khả năng phát video thành các ứng dụng hiện có.

2

Chỉ cần ghi lại điều này ở đây trong trường hợp có ai đó tình cờ gặp phải câu hỏi này. Tôi đã không thể có được bất cứ điều gì để hiển thị trên màn hình thứ hai cho đến khi tôi nhận ra rằng đại biểu ứng dụng của tôi đã phải giữ lại UIWindow. Nó không có chủ sở hữu tự nhiên, vì vậy nếu bạn chỉ làm một autorelease thông thường, cửa sổ sẽ được phát hành trước khi nó hiển thị.

Hy vọng điều đó sẽ hữu ích.

+1

Làm việc trên một cái gì đó tương tự như tôi đã có vấn đề quá, cảm ơn! Tôi đang sử dụng ARC và thậm chí không xem xét ai sẽ giữ lại nó. – jblocksom

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