最近Titanium Mobileをやってます。

http://developer.appcelerator.com/

Titaniumはとっても生産性が上がる素晴らしいツールなんですが 使っていくうちに、もう少しOOPっぽく楽に書きたいなと思うようになりました。

そのひとつの回答として「CoffeeScript」を使うというのがあるんですけど

CoffeeScriptを使ったTitanium Mobileアプリケーション開発

http://d.hatena.ne.jp/donayama/20110107/titanium_with_coffeescript

Objective-Cを生成するためのJavaScriptを生成するためのCoffeeScriptを書く というところに、どうしても抵抗があります(何をいまさら・・)。

複数人で、しかも学習しながら開発をしようと考えているので リファレンスやサンプルを一度CoffeeScriptに翻訳するというプロセスは 結構きついだろうと思いました。

そこでmootoolsを使います。

http://mootools.net/

mootoolsにはサーバサイド用のmootools-serverというのがあるので、それを使いましょう。

http://mootools.net/download

// app.js
Ti.include('mootools-core-1.3-server.js');
var Window = new Class({
    initialize: function(options){
        return Ti.UI.createWindow(options)
    }
});

var w = new Window({backgroundColor: '#fff'});
w.open();

こんな感じでクラスベースにコードを書いていくことができます。

Titaniumに適したJSライブラリを探している方、お試しアレ。

CM

僕が最近起こした会社FoodFotoでは、エンジニア、デザイナーを募集しています。

サーバインフラに強い方、Railsに詳しい方、TitaniumでiPhone開発したい方、iPhoneやWebサービスのデザインをしたい方、などなど募集中です。一緒に世界をめざそーぜ。

興味あるという方がいらっしゃいましたら、@func09haga@foodfoto.jp 宛にご連絡ください。

Posted in iPhone, javascript at 1月 13th, 2011. 1 Comment.

iPhoneで有料アプリの無料版を同じXcodeプロジェクトで作りたい時のTipsです。

普通にアプリを作る

「こんにちは有料アプリ」と表示するだけのアプリ「HelloApp」を作りました。

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
  [windowmakeKeyAndVisible];
  UILabel*messageView = [[UILabelalloc] initWithFrame:CGRectMake(10, 30, 300, 20)];
  messageView.text= @"Hello Paid App";
  [windowaddSubview:messageView];
  returnYES;
}

実行結果

無料版用のターゲットを作る

XCodeのターゲットから、オリジナルのターゲットを複製する。

複製したターゲット名を「HelloApp Lite」に変更して、ビルド設定を修正する。

GCC-プリプロセスの「プリコンパイルされたヘッダに使用しないプリプロセッサマクロ」に 「FREE_VERSION=1」を追加する。定義名は任意なので自分のわかりやすいように。

プロダクト名を「HelloApp Lite」にする。

Info.plistファイルを「HelloApp Lite-info.plist」にする。

プロジェクト内に作成されている「HelloApp-Info copy-info.plist」を併せて名称変更する。

ソースコード内で分岐する

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    
  UILabel*messageView = [[UILabelalloc] initWithFrame:CGRectMake(10, 30, 300, 20)];
#ifdef FREE_VERSION
  messageView.text= @"Hello Free App";
#else
  messageView.text= @"Hello Paid App";
#endif
  [windowaddSubview:messageView];
  [windowmakeKeyAndVisible];
  returnYES;
}

アクティブターゲットを「HelloApp Lite」にしてビルドすれば、無料版の出来上がり〜。

Posted in iPhone at 4月 14th, 2010. No Comments.

iPhone SDK 3.1.x あたりでの話です。

iPhoneでカメラ撮影した後の画像をファイルに保存する際(写真ライブラリじゃなくて)には 一度NSDataに変換してから保存するステップになると思うんですが、 NSDataに変換したデータをUIImageに戻すと写真の方向がおかしくなってしまいました。

具体的にはiPhoneを縦にして撮影した写真が横になってしまったりとか。

結論からいいますと、UIImagePNGRepresentationを使ってNSDataに変換していたのがダメらしく、UIImageJPEGRepresentationならOKでした。あんまり根本的解決になってないけれど、妥協できるラインだったのでこの方法で対処しました。

縦横の方向がおかしくなるコード例

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // UIImage取り出し
    UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    // PNGデータに変換
    NSData *imageData = UIImagePNGRepresentation(originalImage);
    // NSDataをUIImageに戻す
    UIImage *decodedImage = [UIImage imageWithData:imageData];
    // UIImageViewに設定
    imageView.image = decodedImage;
    // イメージピッカーを非表示
    [self dismissModalViewControllerAnimated:YES];
}

縦横の方向を正しく保持できるコード例

- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
    // UIImage取り出し
    UIImage *originalImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    // JPEGデータに変換
    NSData *imageData = UIImageJPEGRepresentation(originalImage, 0.9);
    // NSDataをUIImageに戻す
    UIImage *decodedImage = [UIImage imageWithData:imageData];
    // UIImageViewに設定
    imageView.image = decodedImage;
    // イメージピッカーを非表示
    [self dismissModalViewControllerAnimated:YES];
}

超参考になったページ

Fifty Outs: Camera image orientation
http://mohrt.blogspot.com/2009/05/camera-image-orientation.html

Posted in Objective-C at 4月 13th, 2010. No Comments.