Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[iOS] AirPlay 與雙螢幕支援

[iOS] AirPlay 與雙螢幕支援

Johnny Sung

October 17, 2013
Tweet

More Decks by Johnny Sung

Other Decks in Programming

Transcript

  1. Apple TV • Lightning Digital AV Adapter • Lightning to

    VGA Adapter • Apple 30-pin Digital AV Adapter • Apple 30-pin to VGA Adapter Friday, October 18, 13
  2. - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[UIWindow alloc]

    initWithFrame: [[UIScreen mainScreen] bounds]]; self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; return YES; } 這是我們常常在AppDelegate看到的句⼦子 Friday, October 18, 13
  3. 我們要做的 • APP啓動時 • 檢查⺫⽬目前螢幕的數量 註冊螢幕 連接/斷開 的notification • 將對應的UIWindow設定好

    • 收到螢幕連接的notification時 • 建⽴立對應的UIWindow並且設定 Friday, October 18, 13
  4. NSArray* screens = [UIScreen screens]; for (UIScreen *screen in screens)

    { if (screen == [UIScreen mainScreen]) { self.window = [[UIWindow alloc] initWithFrame:[screen bounds]]; [self.window setScreen:screen]; ViewControllerA* vcA=[ViewControllerA alloc] initWithNibName:@"xibA" bundle:nil]; self.window.rootViewController = vcA; [self.window makeKeyAndVisible]; } else { self.window2 = [[UIWindow alloc] initWithFrame:[screen bounds]]; [self.window2 setScreen:screen]; ViewControllerB* vcB=[ViewControllerB alloc] initWithNibName:@"xibB" bundle:nil]; self.window2.rootViewController = vcB; self.window2.hidden=NO; } } 根據UIScreen設定對應的UIWindow Friday, October 18, 13
  5. 註冊螢幕 連接/斷開 的notification (1/2) 在 application:didFinishLaunchingWithOptions: 裡 [[NSNotificationCenter defaultCenter] addObserver:self

    selector:@selector(screenDidConnect:) name:UIScreenDidConnectNotification object:nil]; [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(screenDidDisconnect:) name:UIScreenDidDisconnectNotification object:nil]; APP關閉時,記得解除註冊 在 applicationWillTerminate: 裡 [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenDidConnectNotification object:nil]; [[NSNotificationCenter defaultCenter] removeObserver:self name:UIScreenDidDisconnectNotification object:nil]; Friday, October 18, 13
  6. 註冊螢幕 連接/斷開 的notification (2/2) - (void) screenDidConnect:(NSNotification *) notification {

    UIScreen* screen = [notification object]; // 建⽴立UIWindow ... } Friday, October 18, 13
  7. 取得ViewController⺫⽬目前的解析度 在 viewDidLoad 裡 CGRect screenRect = [[[[self view] window]

    screen] bounds]; CGFloat screenWidth = screenRect.size.width; CGFloat screenHeight = screenRect.size.height; NSLog(@"Screen: %.0f x %.0f", screenWidth, screenHeight); Friday, October 18, 13
  8. Reference • Using Windows to Present Content on Multiple Displays

    https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/ Introduction/Introduction.html • Understanding Windows and Screens https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/ WindowScreenRolesinApp/WindowScreenRolesinApp.html • Presenting Content on an External Display https://developer.apple.com/library/ios/documentation/WindowsViews/Conceptual/WindowAndScreenGuide/ UsingExternalDisplay/UsingExternalDisplay.html#//apple_ref/doc/uid/TP40012555-CH3-SW1 • UIScreen Class Reference https://developer.apple.com/library/ios/documentation/uikit/reference/UIScreen_Class/Reference/UIScreen.html • UIWindow Class Reference https://developer.apple.com/library/ios/documentation/uikit/reference/UIWindow_Class/ UIWindowClassReference/UIWindowClassReference.html Friday, October 18, 13
  9. 將 self.viewController = [[ViewController alloc] initWithNibName:@"ViewController" bundle:nil]; 換成 UIStoryboard *mainStoryboard

    = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle: nil]; self.viewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"ViewController"]; 使⽤用 StoryBoard ? Friday, October 18, 13