Как отобразить пользовательский контент на внешнем экране с устройства 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
метод к этому
-(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];
}