Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

IOS - External (hdmi) output fills only half the screen except when coding view manually

Tags:

So, as the title says, I have an hdmi out on the iPad and an observer registered for screen connections, upon connection the user chooses the res and a view is outputted.

However, if I load a view from a nib, or even from a programatic view controller, the ipad shows a landscape view in portrait (yes, both situations are set to landscape).

I.e.

ExternalViewController *ex = [[ExternalViewController alloc] init]; [externalWindow setRootViewController:ex]; 

does this:

Bad If I create the view itself programatically. like so:

UIView *test = [[UIView alloc] initWithFrame:[externalScreen applicationFrame]]; [test setBackgroundColor:[UIColor whiteColor]]; UILabel *msgLabel = [[UILabel alloc] initWithFrame:CGRectMake(10, 40, 100, 30)]; msgLabel.text = @"External!"; [test addSubview:msgLabel]; 

It runs like some form of magical dream:

good

However I want the viewcontroller to load (and work!) so, StackOverflow, I ask you. has anyone come across this before?

EDIT: It does go without saying that common sensical answers do not get a bounty, I am after a fix, not a workaround. With my limited brain, all I can think to do is create a method that creates a view based on it's inputs and adds that as a subview of the external monitor, it is clear that this is a hack solution so a fix is appreciated! Thanks!

EDIT:

-(id)initWithFrame:(CGRect)_rect  {     rect = _rect;     if (self = [super init])      {         externalView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"105.png"]];         externalView.alpha = 0.0;         [externalView setFrame:rect];         [externalView setBackgroundColor:[UIColor yellowColor]];         self.view = [[UIView alloc] initWithFrame:rect];         self.view.backgroundColor = [UIColor whiteColor];          return self;     } }  - (void)loadView {     self.view = [[UIView alloc] initWithFrame:rect];     self.view.backgroundColor = [UIColor blackColor];     [self.view addSubview:externalView]; } 

As requested, this is how I am loading the viewcontroller, initialising with the size of the external screen. Thanks

like image 846
Christopher Gwilliams Avatar asked Nov 11 '11 17:11

Christopher Gwilliams


1 Answers

Just return NO in - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation in your UIViewController subclass.

// ugly, don't use this in real code  if ([UIScreen screens].count == 1) return; // just one screen, eww.  // getting the secondary screen UIScreen *screen = [[UIScreen screens] objectAtIndex:1];  __block UIScreenMode *highestWidthMode = NULL;  [screen.availableModes enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {   UIScreenMode *currentModeInLoop = obj;   if (!highestWidthMode || currentModeInLoop.size.width > highestWidthMode.size.width)     highestWidthMode = currentModeInLoop; }];  // setting to the highest resolution available screen.currentMode = highestWidthMode;  NSLog(@"screen.currentMode = %@", screen.currentMode); screen.overscanCompensation = UIScreenOverscanCompensationScale;   // initializing screen secondWindow = [[UIWindow alloc] initWithFrame:[screen bounds]]; [secondWindow setScreen:screen];  // other view is a UIViewController, just remember to return NO in - (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation or the iOS will rotate the frame.  UIViewController *vc = [[OtherView alloc] initWithNibName:@"OtherView" bundle:nil]; secondWindow.rootViewController = vc; [secondWindow makeKeyAndVisible]; 
like image 71
Marcelo Alves Avatar answered Nov 02 '22 23:11

Marcelo Alves