デザイン変更、一段落しました




デザイン変更が一段落したので、公開する事にしました。


どんなデザインにしようか色々迷ったんですが、
最終的にはシンプルで落ちついたものにしようと思い現行のこんな感じになりました。


まだ、ちょこちょこいじりたい所はいくつかありますが、それは追々という事で。


今回の変更にあたり元々WEB屋(最近はiOSばっかりです)なんですが、
HTML能力が壊滅的に低い状態wだったので色々苦労しました。


今回、とっても役立ったのがChromeの「要素の検証」。
これ、めっちゃ便利ですね。


これのおかげで大分作業がスムーズに行きました。
Chrome様様です。





CSS:マウスオーバーで背景画像を入れ替える 辺りの記事も
参考にさせていただきました。


Chromeの使い方等、同僚のku-sukeのアドバイスがとっっっても参考になりました。
本当ありがとうー。また困った時はよろしくーw


Shareしていただけると励みになりますので
良ければよろしくお願いします

デザインいじってます




ブログデザインをいじってるので、中途半端にへんな状態で残ってたりする可能性があるので
そこは当分ご了承ください。


今後、ブログも頑張るぞっという意気込みをこめて現在デザイン思考中です。


よろしくお願いします。


Shareしていただけると励みになりますので
良ければよろしくお願いします

UIViewController ライフサイクルについて その2




前回書いた
UIViewController ライフサイクルについて その1の続きです。


その1ではライフサイクルの順番について確認してみました。
今回はさらに各メソッドの詳細や処理されるタイミング等についてまとめたいと思います。


各メソッドの役割は以下のようです。
メソッド 内容
-(void)loadView nibファイルでviewを生成せずに、
viewをプログラム内で生成する場合に使用する。
呼び出し順番としては
Viewが生成される前に呼び出される。
ある条件の時以外はViewController生成後、
一度しか呼び出されない。※1
-(void)viewDidLoad nibを使用した場合はnibで定義されたviewが
準備完了した場合に、
nibを使用しなかった場合はloadViewで
生成したViewが準備できたタイミングで
呼び出される。
ある条件の時以外はViewController生成後、
一度しか呼び出されない。※1
-(void)viewWillAppear:(BOOL)animated viewが表示される直前に呼び出される。
viewControllerが生成後、
呼び出される度にメソッドも呼び出される。※2
-(void)viewDidAppear:(BOOL)animated viewが表示される直後に呼び出される。
viewControllerが生成後、
呼び出される度にメソッドも呼び出される。※2
-(void)viewWillDisappear:(BOOL)animated viewが非表示になる直前に呼び出される。
viewControllerが生成後、
消される度にメソッドも呼び出される。※2
-(void)viewDidDisappear:(BOOL)animated viewが非表示になった直後に呼び出される。
viewControllerが生成後、
消される度にメソッドも呼び出される。※2

※1 didReceiveMemoryWarningが発生した場合に、
viewDidUnloadが呼ばれた後に再ロードとしてもう一度呼ばれる

※2 一度、UIViewControllerが生成され、再表示が発生した場合に呼び出される。
例えば、presentModalViewControllerしたUIViewControllerに
dismissModalViewControllerAnimatedして戻ってきた時などが該当する。



前回確認した順序にviewの表示、非表示を追加すると
表示系が

loadView → viewが準備できた → viewDidLoad → viewWillAppear → viewが表示 → viewDidAppear
消去系が

viewWillDisappear → viewControllwerが非表示 → viewDidDisappear
という順になるようです。



特に今回の調べた部分で一番解りづらかった部分(今でもあくまで、個人的な見解です)
はloadViewとviewDidLoadの差でした。


この部分の話しは他にも色々なサイトや本で記述されていて、
nibにviewがない場合にloadViewが呼ばれるなど記載されている事が多くありました。
ですが、自分の調査の中ではnibがあった場合に.viewを呼ばなくても
loadViewはUIViewControllerが生成されるたびに呼ばれている気がします。
(loadViewの中でまさにviewを読み出しているという感じです)


他では、viewWillDisappear〜viewDidDisappearが呼ばれる時と呼ばれない時が
あるんですがその部分も中々わかりづらい部分かもしれません。
今回調べた詳細を「loadViewとviewDidLoad」、
「ライフサイクルの呼ばれ方」の様に分けて次回以降に記載できればと思います。





Shareしていただけると励みになりますので
良ければよろしくお願いします

UIViewController ライフサイクルについて その1




UIViewControllerのライフサイクルについて会社での研修の確認で
ちょっと話しに上がったので、まとめてみる事にしました。

まずはUIViewControllerでライフサイクル用に用意されているメソッドを列挙。


- (void)loadView;
- (void)viewDidLoad;
- (void)viewWillAppear:(BOOL)animated;
- (void)viewDidAppear:(BOOL)animated;
- (void)viewWillDisappear:(BOOL)animated;
- (void)viewDidDisappear:(BOOL)animated;


動作確認用に以下のLifeCycleTestプロジェクトをWindowBaseで作成。

LifeCycleTestViewControllerをnib無しで作成。
.mに該当のライフサイクルメソッドを以下のように定義。

【LifeCycleTestViewController.m】

//--------------------------------------------------------------//
#pragma mark -- View lifecycle --
//--------------------------------------------------------------//

- (void)loadView
{
  [super loadView];
  NSLog(@"loadView");
}

- (void)viewDidLoad
{
  [super viewDidLoad];
  NSLog(@"viewDidLoad");

  self.view.backgroundColor = [UIColor yellowColor];
  UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
  button.frame =
    CGRectMake((self.view.frame.size.width - 100) /2,
        (self.view.frame.size.height - 30) /2,
        100.0,
        30.0);
  [button setTitle:@"remove" forState:UIControlStateNormal];
  [button addTarget:self action:@selector(removeAction:)  
            forControlEvents:UIControlEventTouchUpInside];
  [self.view addSubview:button];
}

- (void)viewWillAppear:(BOOL)animated
{
  [super viewWillAppear:animated];
  NSLog(@"viewWillAppear");
}

- (void)viewDidAppear:(BOOL)animated
{
  [super viewDidAppear:animated];
  NSLog(@"viewDidAppear");
}

- (void)viewWillDisappear:(BOOL)animated
{
  [super viewWillDisappear:animated];
  NSLog(@"viewWillDisappear");
}

- (void)viewDidDisappear:(BOOL)animated
{
  [super viewDidDisappear:animated];
  NSLog(@"viewDidDisappear");
}

//--------------------------------------------------------------//
#pragma mark -- LifeCycleTestViewController method --
//--------------------------------------------------------------//
- (IBAction)removeAction:(id)sender
{
  [self.view removeFromSuperview];
}


Viewが消えるタイミングも確認するために、viewDidLoadメソッドに
UIButtonを生成する処理も入れてます。removeActionでviewを消す感じですね。



次にLifeCycleTestAppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
メソッドでLifeCycleTestViewControllerを生成。windowにaddSubviewします。
【LifeCycleTestAppDelegate.h】

@interface LifeCycleTestAppDelegate : NSObject {
  UIWindow *window;
  LifeCycleTestViewController *lctViewController;
}
【LifeCycleTestAppDelegate.m】

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  // Override point for customization after application launch.

  lctViewController = [ [LifeCycleTestViewController alloc]init];
  NSLog(@"lctViewController create");
  [window addSubview:lctViewController.view];
  [window makeKeyAndVisible];

  return YES;
}

- (void)dealloc
{
  [lctViewController release];
  [window release];
  [super dealloc];
}


はい、以上で一応準備は完了。
では実行して確認してみます。
下みたいな画面が出ます。


上の画面のremoveボタンを押す所まで処理してログの結果は以下の通りに出ました。

LifeCycleTest[2193:207] lctViewController create
LifeCycleTest[2193:207] loadView
LifeCycleTest[2193:207] viewDidLoad
LifeCycleTest[2193:207] viewWillAppear
LifeCycleTest[2193:207] viewDidAppear
LifeCycleTest[2193:207] viewWillDisappear
LifeCycleTest[2193:207] viewDidDisappear

順序としては
表示系が

loadView → viewDidLoad → viewWillAppear → viewDidAppear
消去系が

viewWillDisappear → viewDidDisappear
の順番ですね。
各メソッドの詳細についても書きたかったのですが、ちょっと長くなってきたので
次回(その2)に続きを書く事にして、本日はこれまでとします。


【今回のサンプルプロジェクト】




Shareしていただけると励みになりますので
良ければよろしくお願いします

iPhone/iPad/iPod touch 機種判定、iOSバージョン/ハードウェア情報 取得 判定




最近ユニバーサルアプリを作成する機会があって、
昔利用させてもらった判定文を再度利用する機会があったので
ついでに自分のサイトにも判定色々をまとめておく事にしました。
【機種判定】

NSString *modelname = [ [ UIDevice currentDevice] model];
if([modelname isEqualToString:@"iPhone"])
{
  //iPhone実機
}
else if([modelname isEqualToString:@"iPod touch"])
{
  //iPod touch実機
}
else if([modelname isEqualToString:@"iPad"])
{
  //iPad実機
}
else if([modelname isEqualToString:@"iPhone Simulator"])
{
  //iPhone and iPad Simulator
}

シミュレータまでちゃんと判別できます。便利ですね。


【OSバージョン判定】


NSArray *versionArray = [ [ [ UIDevice currentDevice]systemVersion]componentsSeparatedByString:@"."];
int majorVersion = [ [ versionArray objectAtIndex:0]intValue];
int minorVersion = [ [ versionArray objectAtIndex:1]intValue];
NSLog(@"VERSION %d.%d",majorVersion,minorVersion);

動画機能やバックグランド等、iOS4.0以降から変わってる部分が結構あるので
その切り分けの時に使ったりします。

if(majorVersion > 3)
{
  // 4.0処理
}
else
{
  // 以前の処理
}
みたいな感じですね。


【ハードウェア判定】


- (NSString *) platform
{
  size_t size;
  sysctlbyname("hw.machine", NULL, &size, NULL, 0);
  char *machine = malloc(size);
  sysctlbyname("hw.machine", machine, &size, NULL, 0);
  /*
  Possible values:
  "i386" = iPhone Simulator // add
  "iPhone1,1" = iPhone 1G
  "iPhone1,2" = iPhone 3G
  "iPhone2,1" = iPhone 3GS
  "iPhone3,1" = iPhone 4 // add
  "iPod1,1" = iPod touch 1G
  "iPod2,1" = iPod touch 2G
  "iPod3,1" = iPod touch 3G // add
  "iPod4,1" = iPod touch 4G // add
  */
  //NSString *platform = [NSString stringWithCString: machine ];
  NSString *platform = [NSString stringWithCString: machine encoding:NSUTF8StringEncoding];
  free(machine);
  return platform;
}

ライブラリ関数 sysctlbynameを使ってハードウェア情報を
最終的には文字列で取得しています。
platformにはコメントタグ内に該当する文字列が入ります。
上記の参考には
http://www.clintharris.net/2009/iphone-model-via-sysctlbyname/
IPHONE DEVELOPER TIPS – Just another WordPress site
を参考にしました。
ハードウェア判定は、解像度の違う画像処理を
判別したりする等の際に使用する事があったりすると思います。





Shareしていただけると励みになりますので
良ければよろしくお願いします

iPhone/iPod touch/iPadのシステム・メモリ




iPhone,iPod touch,iPadの各実機システム・メモリを簡単にまとめてみました。


iPhone
バイス システム・メモリ
iPhone 初代 128MB
iPhone3G 128MB
iPhone3GS 256MB
iPhone4 512MB


iPod touch
バイス システム・メモリ
iPod touch 初代 128MB
iPod touch 第2世代 128MB
iPod touch 第3世代 256MB
iPod touch 第4世代 256MB


iPad
バイス システム・メモリ
iPad 256MB



iPod touch 第4世代は残念ながらiPhone3GSと同様256MBみたいですね。
でも、アプリ内の解像度はiPhone4と同様の740×960なんだろうなぁ。
高解像度で対応しておくとちょっとしんどそうなイメージだけど、どうなんだろ?


個人的にはiPadiPhone3GSと同一なのが、非常に辛いです。
画面サイズが768×1024なので、フル画面用の画像とかは勿論
その解像度にしたいわけなんですがシステム・メモリはiPhone3GS同様
256MBなんで結構しんどかったりします。
特にScrollView使った時のzoomとかはどうすんの?みたいな疑問が個人的には多かったり。
(TiledView使えって事なんだろうけど。。)


参考サイト
http://www.computerworld.jp/topics/iphone/184689.html
2010年のクリスマスを飾る“最強”の布陣――新型「iPod」ファミリー徹底レビュー (3/4) - ITmedia PC USER


Shareしていただけると励みになりますので
良ければよろしくお願いします

ブログにFollow meバッジをつけてみる(はてなダイアリー版)




※すみません、どうやら廃止になっていたようです・・・・
これのせいでページがめっちゃ重くなってましたorz


最近やっとダイアリーをはじめました。
で早速よく見かけるサイトの横についている
「Follow me」ボタンをつけられないかなーと調べた結果のご報告。


この便利ツールは「Follow meバッジ」といいます。




作成は以下のサイトから行います。
http://www.go2web20.net/twitterfollowbadge/



色や表示位置等、細かく設定できますね。
Follow meにしたい場合はLabelを「Follow me」に変更。


で、UPDATE CODEボタンをクリックして
scriptコードをコピペすればOKなんですが、現在使用している「はてなダイアリー」では
どうすれば良いか。


以下の手順で作業を行います。


「管理」→「デザイン」→「詳細タブ」の
「ページのヘッダ」項目のdiv以下に張りつけ。



で見事表示されました。


簡単にできるので、みなさんおすすめです。


Shareしていただけると励みになりますので
良ければよろしくお願いします