Orientation always in Portrait iOS6

Right had to do a bit of research for this one, here is the fix I found that works from Natalie London

In your APP DELEGATE.m

NSString *reqSysVer = @"6.0";
NSString *currSysVer = [[UIDevice currentDevice] systemVersion];

if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending){
[window setRootViewController:viewController]; // This is for IOS6.....
}else{
[window addSubview: viewController.view]; //This is for < IOS6....... (the old way)
}

In your ROOTVIEWCONTROLLER.m //will only be compiled for IOS6

FOR LANDSCAPE USE THIS


- (NSUInteger) supportedInterfaceOrientations {
return UIInterfaceOrientationMaskLandscape;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationLandscapeRight;
}

- (BOOL) shouldAutorotate {
return YES;
}

FOR PORTRAIT USE THIS


- (NSUInteger) supportedInterfaceOrientations {
return  UIInterfaceOrientationMaskPortrait | UIInterfaceOrientationMaskPortraitUpsideDown;
}

- (UIInterfaceOrientation)preferredInterfaceOrientationForPresentation{
return UIInterfaceOrientationPortrait;
}

- (BOOL) shouldAutorotate {
return YES;
}

The page I got this from is

https://devforums.apple.com/message/734618#734618

EXC_BAD_ACCESS

Right so I get this one a lot, especially when I’m coding late at night and tired…which is most of the time. So, my main culprits are objects that I haven’t released in my dealloc method.

Especially look for anything that you created with ALLOC INIT, for example an array

[[NSMutableArray alloc] init]

You must, must, must release it.

Second most common is not removing the class from observing a Notification. So if you have something like

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(classMethod:) name:@"notificationName" object:nil];

Then again in your dealloc method, you must put this

[[NSNotificationCenter defaultCenter] removeObserver:self];

I’m sure there are more things, and I’ll add notes as I discover them.

xcode persistent data

So you want to save some data to the users device for use in your app. The way to do it is thusly,

// declare your app data with whatever name you like
NSUserDefaults *yourAppData = [NSUserDefaults standardUserDefaults];

// retrieve your data with
NSString *myString = [yourAppData objectForKey:@"StringVariableName"];
int myInt = [yourAppData integerForKey:@"IntVariableName"];

// now if this is the first time the app has been run, these won't have any value,
// so it's probably best just to check they aren't null before you try to use them
if(!myString){
// then this is the first time it's been accessed
}else{
// otherwise it has been created and has got a value so do whatever you need to with it here
}

// now to set data use the following

[yourAppData setObject:@"someStringData" forKey:@"StringVariableName"];
[yourAppData setInteger:2 forKey:@"IntVariableName"];

Load a class from String

I often need to dynamically load a class from a concatinated combination of strings and integers. So here is how you do it. In a game for example, you may have a LevelID stored in your appdelegate that changes at the game progresses, so I’ve made the example grabbing such a levelID from the delegate class.

YourAppDelegate *theDelegate = (YourAppDelegate*)[[UIApplication sharedApplication] delegate];
int LevelID = [theDelegate getLevelID];
NSString *levelToLoad = [NSString stringWithFormat:@"Level%i",LevelID];
Class newLevel = NSClassFromString(levelToLoad);

BAM, and it’s done.

Change Cocos2D template to portrait

The template that comes with Cocos2D 0.99.5 is set in landscape mode. Sometimes you want portrait though, so I did the following and it seems to work, and reorient without fail.

In GameConfig.m


// REPLACE THIS LINE #define GAME_AUTOROTATION kGameAutorotationNone
// WITH THE FOLLOWING
#define GAME_AUTOROTATION kGameAutorotationUIViewController

In RootviewController.m in the section of

#elif GAME_AUTOROTATION == kGameAutorotationUIViewController

// EAGLView will be rotated by the UIViewController
//
// Sample: Autorotate only in landscpe mode
//
// return YES for the supported orientations

// REPLACE THIS LINE return ( UIInterfaceOrientationIsLandscape( interfaceOrientation ) );
// WITH THE FOLLOWING
return ( UIInterfaceOrientationIsPortrait( interfaceOrientation ) );

In your appdelegate.m class file


[director setAnimationInterval:1.0/60];
[director setDisplayFPS:YES];
// ADD THE FOLLOWING LINE HERE
[director setDeviceOrientation:kCCDeviceOrientationPortrait];

Project Code for Universal App Creation

Step 1

In your Target Info set the Targeted Device Family to “iPhone/iPad”

Step 2

In your appDelegate.m put this bit of code


- (BOOL) isIpad {
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
return YES;

} else {
return NO;
}
#else
return NO;
#endif
}

To reference it in your other classes do this

in class.h


@interface YourLayerClass : CCLayer {

YourAppDelegate *theDelegate;
Boolean *isIpad;
}

in class.m in your init method


-(id) init
{
if( (self=[super init] )) {

//DEFINE iPad or iPhone
theDelegate = (YourAppDelegate*)[[UIApplication sharedApplication] delegate];
isIpad = [theDelegate isIpad];

}
}

And you can use it in your class thusly


if(isIpad == NO){
bg = [CCSprite spriteWithFile:@"xx_iphone.png"];
}else {
bg = [CCSprite spriteWithFile:@"xx_ipad.png"];
}

simple cocos2d animation using .png sequence

Right, so I do a lot of animation in my apps, so here is the most simple creation of it

yourfile.h

@private CCSprite *youranimref;
@private CCAnimation *animation;

yourfile.m

-(id) init
{
if( (self=[super init] )) {

self.isTouchEnabled = YES;

size = [[CCDirector sharedDirector] winSize];

// DECLARE ANIMATION
animation = [[CCAnimation alloc] initWithName:@"youranimref" delay:1/24.0];
youranimref = [CCSprite spriteWithFile:@"yourFirstAnimGrfx.png"];
[animation addFrameWithFilename: @"yourSecondAnimGrfx.png"];
[animation addFrameWithFilename: @"yourThirdAnimGrfx.png"];
[animation addFrameWithFilename: @"yourFourthAnimGrfx.png"];

// ADD ANIMATION
youranimref.position = ccp( 512, 435 );
[self addChild:youranimref z:5];

}
return self;
}

- (void) dealloc
{

// !!!!! VERY IMPORTANT - REMOVE TEXTURES AND RELEASE REFERENCE TO THE ANIMATION

[[CCTextureCache sharedTextureCache] removeUnusedTextures];
[[CCSpriteFrameCache sharedSpriteFrameCache] removeUnusedSpriteFrames];

// RELEASE RETAINED OBJECTS
[animation release];

[super dealloc];
}

- (void) runAnimation
{

// RUN THE ANIMATION

CCAnimate* action = [CCAnimate actionWithAnimation:animation];
[youranimref runAction:action];

}