Как отобразить пользовательский контент на внешнем экране с устройства iOS

Я создал одно приложение в Objective C. Я хочу реализовать функциональность для отображения выбранной области содержимого экрана на внешнем дисплее. Например, у меня всего 10 экранов, и я хочу показать 4 экрана и не хочу показывать всю часть экрана, просто хочу показать выбранный вид и область экрана на внешнем дисплее.

Я провел исследование по этому вопросу, я нашел один учебник, но этот учебник доступен на быстром языке, и я хочу реализовать это на языке c.

2 ответа

Решение

Учебник по Swift в Objective C Code:

#import "ViewController.h"
#import "ExternalScreenViewController.h"

@interface ViewController ()
{
    UIWindow *externalWindow;
    UIWebView *webView;
}
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    webView = [[UIWebView alloc] init];
    [self setupScreenNotifications];
    NSURL *url = [NSURL URLWithString:@"http://www.spazstik-software.com"];
    NSURLRequest *req = [NSURLRequest requestWithURL:url];
    [webView loadRequest:req];

    if ([[UIScreen screens] count] > 1) {
        [self setupExternalScreen:[UIScreen screens][1]];
    }
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(void)setupScreenNotifications {
    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(externalScreenDidConnect:) name:UIScreenDidConnectNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(externalScreenDidDisconnect:) name:UIScreenDidDisconnectNotification object:nil];

}

-(void)externalScreenDidConnect:(NSNotification *)notification {
    UIScreen *screen = (UIScreen *)[notification object];
    if (screen != nil) {
        [self setupExternalScreen:screen];
    }
}

-(void)externalScreenDidDisconnect:(NSNotification *)notification {
    id obj = [notification object];
    if (obj != nil) {
        [self teardownExternalScreen];
    }
}

-(void)setupExternalScreen:(UIScreen *)screen {
    ExternalScreenViewController *vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"ExternalScreen"];
    externalWindow = [[UIWindow alloc]initWithFrame:screen.bounds];
    externalWindow.rootViewController = vc;
    externalWindow.screen = screen;
    externalWindow.hidden = false;
}

-(void)teardownExternalScreen {
    if (externalWindow != nil) {
        externalWindow.hidden = true;
        externalWindow = nil;
    }
}
@end

Для iOS 13 и выше измените setupExternalScreen метод к этому

источник: /questions/51894386/zerkalnoe-otobrazhenie-vneshnego-ekrana-ios13-poyavlyaetsya-oshibka-ne-sleduet-v/51894396#51894396

      -(void)setupExternalScreen:(UIScreen *)screen shouldRecurse:(bool)recurse {
    
    UIWindowScene* matchingWindowScene = nil;
    
    // For iOS13 and up find matching UIWindowScene
    for(UIScene *aScene in UIApplication.sharedApplication.connectedScenes){
        UIWindowScene *windowScene = (UIWindowScene*)aScene;
        // Look for UIWindowScene that has matching screen
        if (windowScene.screen == screen) {
            matchingWindowScene = windowScene;
            break;
        }
    }
    
    if (matchingWindowScene == nil) {
        // UIWindowScene has not been created by iOS rendered yet
        // Lets recall self after delay of two seconds
        if (recurse) {
            dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 2 * NSEC_PER_SEC), dispatch_get_main_queue(), ^{
                [self setupExternalScreen:screen shouldRecurse:NO];
            });
        }
        // Dont proceed further if none found
        return;
    }
    
    // Instantiate view controller
    ExternalScreenViewController *vc = [[self storyboard] instantiateViewControllerWithIdentifier:@"ExternalScreen"];
    
    // Setup external window
    externalWindow = [[UIWindow alloc] initWithFrame:screen.bounds];
    [externalWindow setRootViewController: vc];

    // Set scene
    [externalWindow setWindowScene:matchingWindowScene];
    // Show the window.
    [externalWindow setHidden:NO];
}
Другие вопросы по тегам