Showing a UIViewController on an SDL based iOS project

Maybe this is useful for other people. It needs to be compiled as .mm in
order to be callable from C++.

void PresentModalView( const char* viewName )
{
SDL_SysWMinfo info;
SDL_VERSION( &info.version );

if( SDL_GetWindowWMInfo( window, &info ) )
{
UIWindow* uiWindow = (UIWindow*)info.info.uikit.window;
UIView* view = [uiWindow.subviews objectAtIndex:0];
id nextResponder = [view nextResponder];
if( [nextResponder isKindOfClass:[UIViewController class]] )
{
UIViewController* viewController =
(UIViewController*)nextResponder;

   // You can do some terrifying things with Objective-C
   NSString* className = [NSString stringWithUTF8String:viewName];
   Class ViewControllerClass = NSClassFromString(className);
   id subviewController = [[[ViewControllerClass alloc]
     initWithNibName:className bundle:nil] autorelease];

   [viewController presentModalViewController:
     subviewController animated:YES];
 }

}
}

I think Sam added a function that makes this unnecessary , I don’t recall the name.

Here IS how we used to do it.

-(void) swapViews {
UIWindow *windows = [[UIApplication sharedApplication] keyWindow];
NSLog(@"the app has %d views ",[windows.subviews count]);
//toggle_pause();
UIView *view = [window.subviews objectAtIndex:0];
[view removeFromSuperview];
[windows addSubview:view];
}

-(void) swapViewsWithTransition {
UIWindow *windows = [[UIApplication sharedApplication] keyWindow];
UIView *firstView = [window.subviews objectAtIndex:0];
UIView *secondView = [window.subviews objectAtIndex:1];
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationDuration:1];
[UIView setAnimationTransition:([secondView superview] ? UIViewAnimationTransitionFlipFromRight : UIViewAnimationTransitionFlipFromLeft) forView:firstView cache:YES];
[firstView removeFromSuperview];
[windows addSubview:firstView];
[UIView commitAnimations];

I think Sam added a function that makes this unnecessary , I don’t
recall the name.

Hmm really? I can’t seem to find it. I’m not sure it’s really
appropriate for SDL anyway. It should however be possible as it’s
likely to be a very common thing to want to do. Worth bunging in the
wiki somewhere anyway; though I’m not sure where.

Here IS how we used to do it.

-(void) swapViews {
UIWindow *windows = [[UIApplication sharedApplication]
keyWindow];

I guess this makes the assumption that there is only one window? The
part I negelected to mention in my post is that “window” is an
SDL_Window* global, but it could just as easily be a parameter.On Sun, 17 Jul 2011 07:56:14 -0700 michelleC wrote:

Tim Angus wrote:> On Sun, 17 Jul 2011 07:56:14 -0700 michelleC wrote:

I think Sam added a function that makes this unnecessary , I don’t
recall the name.

Hmm really? I can’t seem to find it. I’m not sure it’s really
appropriate for SDL anyway. It should however be possible as it’s
likely to be a very common thing to want to do. Worth bunging in the
wiki somewhere anyway; though I’m not sure where.

Here IS how we used to do it.

-(void) swapViews {
UIWindow *windows = [[UIApplication sharedApplication]
keyWindow];

I guess this makes the assumption that there is only one window? The
part I negelected to mention in my post is that “window” is an
SDL_Window* global, but it could just as easily be a parameter.


Sure, but thats usually how an iphone app is structured, one window but x number of viewcontrollers.

multiple windows don’t make sense on the iphone

However I guess you could have two windows and swap between them.

http://code.google.com/p/ffmpeg4iphone/source/browse/WebStreamx/WebStreamXNoLibs/uikit/SDL_uikitappdelegate.m
SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

That’s exactly how I implemented my application; I have subclassed the
sdlappuikitdelegate and created my objc frontend, then i call some code that
instances a second uiwindow and fills it with a sdl context
More details here:
http://code.google.com/p/hedgewars/source/browse/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m

bye
VittorioOn Sun, Jul 17, 2011 at 11:47 PM, michelleC wrote:

**

Sure, but thats usually how an iphone app is structured, one window but x
number of viewcontrollers.

multiple windows don’t make sense on the iphone

However I guess you could have two windows and swap between them.

http://code.google.com/p/ffmpeg4iphone/source/browse/WebStreamx/WebStreamXNoLibs/uikit/SDL_uikitappdelegate.m
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org


SDL mailing list
SDL at lists.libsdl.org
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org

Yep, I’ve seen your app , nice.

I originally used multiple windows, but it really breaks (model wise not technically) the ios implementation.

I pretty easy to get hold of the sdl window and add view controllers to it, or get the encapsulated sdl view and add it to a view controller.

Is there any particular reason you used freepascal??

Also I am very interested in your android experience, I am having a great deal of problems with our app because it uses software yuv12 textures, and runs into memory issues very quick.

I have not been able to get sam’s open gles 2 renderer to work, which should solve the problems.

Here’s one for the road as they say

/* construct our view, passing in SDL’s OpenGL configuration data */
view = [[SDL_uikitopenglview alloc] initWithFrame: [[UIScreen mainScreen] applicationFrame]
retainBacking: _this->gl_config.retained_backing
rBits: _this->gl_config.red_size
gBits: _this->gl_config.green_size
bBits: _this->gl_config.blue_size
aBits: _this->gl_config.alpha_size
depthBits: _this->gl_config.depth_size];

data->view = view;

UINavigationController *localNavigationController;
RootViewController *rootViewController;
rootViewController = [[RootViewController alloc] init];
SDLUIKitDelegate *appDelegate = [SDLUIKitDelegate sharedAppDelegate];
localNavigationController = [[UINavigationController alloc] initWithRootViewController:rootViewController];

//rootViewController.view.opaque = YES;
localNavigationController.view.alpha = 1.0;	
localNavigationController.modalPresentationStyle = UIModalPresentationFormSheet;
[localNavigationController setModalTransitionStyle:UIModalTransitionStyleFlipHorizontal];

Vittorio G. wrote:> That’s exactly how I implemented my application; I have subclassed the sdlappuikitdelegate and created my objc frontend, then i call some code that instances a second uiwindow and fills it with a sdl context

More details here: http://code.google.com/p/hedgewars/source/browse/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m (http://code.google.com/p/hedgewars/source/browse/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m)

bye
Vittorio

On Sun, Jul 17, 2011 at 11:47 PM, michelleC <@michelleC (@michelleC)> wrote:

Sure, but thats usually how an iphone app is structured, one window but x number of viewcontrollers.

multiple windows don’t make sense on the iphone

However I guess you could have two windows and swap between them.

http://code.google.com/p/ffmpeg4iphone/source/browse/WebStreamx/WebStreamXNoLibs/uikit/SDL_uikitappdelegate.m (http://code.google.com/p/ffmpeg4iphone/source/browse/WebStreamx/WebStreamXNoLibs/uikit/SDL_uikitappdelegate.m)
SDL mailing list

http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org (http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org)


SDL mailing list
SDL at lists.libsdl.org (SDL at lists.libsdl.org)
http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org (http://lists.libsdl.org/listinfo.cgi/sdl-libsdl.org)