スポンサードリンク



  • nibファイルとxibファイルは同じ意味

    AppleのDeveloperサイトでドキュメントを読んでいると
    Nibファイルというのが出てきます。

    でも、私が開発をはじめてからNibファイルというものを扱った記憶がありません。

    IBでViewConrollerを作ったときに画面のデザインを定義しているxibファイルをソースコードで以下のように指定するのですが

    TestViewController *testViewController =
    [[TestViewController alloc] initWithNibName:@"TestView" bundle:nil];

    initWithNibNameというメソッドを使ってxibファイルを指定します。

    上の例では、TestView.xibファイルをinitWithNibNameで指定します。

    結果としてはNibファイルとXibファイルは同じ物ということです。

    どこかの時点で変更されたようですが、アプリ開発初心者はこういう名称の違いにも迷ってしまいますよね。

     
  • iphoneアプリでzipファイルを扱う

    iPhoneで写真や動画を保存する場合、ファイルサイズを小さくして置いておきたいです。そこでzipファイルが扱えないのか調べたらありました。

     

    ziparchive – google code

     

    このサイトからファイルをダウンロードできるのですが、iOS2.0用のコードで書かれているため、iOS4.0以降の人は自分で修正する必要があります。わたしもトライしましたがそんなにC言語を理解しているわけではないので、大変でした。

    svn checkoutして最新のソースを取得するのが楽です。osxには標準でsvnが入っているのかちょっと不明ですが、私は問題なくsvn checkoutができました。もしできない人がいればmacportsからsvnをインストールしてみてください。

     

    svn checkout http://ziparchive.googlecode.com/svn/trunk/ ziparchive-read-only

     

    を実行するとファイルの取得が始まります。

    取得したファイルをxcode projectにコピーします。私はview-basedのプロジェクトを作成し、Classesの下にコピーしました。

    ziparchive_in_xcode

     

    zipファイルが作成できるかどうかを試したので、viewDidLoadメソッドで処理を書いてます。アプリを立ち上げたらすぐにzipファイル作成するという仕組みです。

    ZipTest2ViewController.h

    //
    //  ZipTest2ViewController.h
    //  ZipTest2
    //
    //  Created by ksaioji on 11/05/10.
    //  Copyright 2011 __MyCompanyName__. All rights reserved.
    //
    
    #import
    #import "ZipArchive.h"
    
    @interface ZipTest2ViewController : UIViewController {
    
    }
    
    @end
    

    ZipTest2ViewController.m

    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {
        [super viewDidLoad];
    
    	NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    	NSString *documentsDirectory = [paths objectAtIndex:0];
    	NSLog(@"%@",documentsDirectory);
    
    	ZipArchive* zip = [[ZipArchive alloc] init];
    
    	NSString *zipPath = [NSString stringWithFormat:@"%@/target.zip",documentsDirectory];
    	NSString *pngPath = [NSString stringWithFormat:@"%@/button_green.png",documentsDirectory];
    
    	BOOL ret = [zip CreateZipFile2:zipPath];
    	NSLog(@"%d",ret);
    
    	//ret = [zip addFileToZip:@"target.zip" newname:pngPath];
    	//addFileToZipには上で作成したzipファイルに登録するファイルを指定。newnameには解凍後に表示されるファイル名を指定
    	ret = [zip addFileToZip:pngPath newname:@"button_green.png"];
    	NSLog(@"%d",ret);
    	[zip CloseZipFile2];
    
    	if(!ret) {
    		// エラー処理
    		NSLog(@"zip error");
    	}
    	[zip release];
    
    }
    
     
  • Sleep Cycleの仕組み、見つけました

    sleep cycle graph

    Sleep Cycle、ちょうどいい時間に起こしてくれるので便利です。

    ただ、アラーム音が私にとっては小さいので本当に疲れているときは起きれないことがあるんですけど。

    どうやって眠っているサイクルを取得しているのか、そのロジックが気になったので調べてみました。

    置き方

    使い方の写真に上のようにiphoneを裏側にして枕の横に置くように説明しているため、近接センサーで何かやっているのかと思っていました。近接センサーは電話のときの画面を顔に近づけると、画面が切り替わって入力ができないようにするなどの処理で利用されています。

    しかし、ネットを調べてみるとAccelerometerを使っているという記述を発見!

    そこで、Sleep Cycleの説明をよく読んでみると

    使い方

    上記の赤枠のようにAccelerometerすなわち加速度センサーを利用しているそうです。寝ているときの寝返りの動きを加速度センサーで取得して睡眠サイクルを計算しているようです。

    加速度センサーを利用するためのサンプルコードは以下です。

    UIAccelerometerDelegateメソッドを宣言する必要があります。

    AccelerometerViewController.h

    interface AccelerometerViewController : UIViewController
    < UIAccelerometerDelegate // 加速度センサ
    >
    {
    	UIAccelerationValue accelX, accelY, accelZ; // ノイズ除去済の各軸座標
    	//その他の処理
    }

    AccelerometerViewController.m

    - (void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleratio {
    
    	CGFloat saY = prevAcceleratioY - acceleratio.y; //前回のY軸の重力との差
    	if (acceleratio.y > power || acceleratio.y < -1*power){		 		//if ( prevAcceleratioX - acceleratio.x > 2 || prevAcceleratioX - acceleratio.x < 1 ) {
    		if ( saY < 0 ) {
    			NSLog(@"重力 Y 現:%f, 差:%f",acceleratio.y,saY);
    			varStep++;
    			NSString *dateStr = [NSString stringWithFormat:@"%d", varStep];
    			[aLabel setText:dateStr];
    		}
    	}