2012年3月29日木曜日

GestureRecognizerを使ってタッチ操作を検知

iPhone/iPadの特殊的な操作(タップ、スワイプ、長押しなど)はUIGestureRecognizerクラスを使って簡単に検知できます。
UITapGestureRecognizer
タップ操作を検知。タップ数(numberOfTapsRequired)や指の本数(numberOfTouchesRequired)を指定することができます。
UILongPressGestureRecognizer
長押しを検知。認識されまるの時間(minimumPressDuration)を指定することができます。ロングプレスは長押しが検知されたときと指が離されたときにイベントが発生します。
UISwipeGestureRecognizer
スワイプを検知。スワイプの方向(direction)や指の本数(numberOfTouchesRequired)を指定することができます。
UIPanGestureRecognizer
パン(ドラッグ)を検知。ドラッグ開始から終了までの移動座業(translationInView)や移動の早さ(velocityInView)を取得することができます。
UIPinchGestureRecognizer
ピンチ操作を検知。倍率(scale)や早さ(velocity)を取得できます。
UIRotateGestureRecognizer
回転操作を検知。回転角度(roration)や早さ(velocity)を取得できます。
以下、タップとスワイプと長押しのサンプル
// ジェスチャーの設定
- (void)createGestureRecognizer
{
    // タップ検知
    UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc]
                                                     initWithTarget:self
                                                     action:@selector(handleTapGesture:)];
    tapGesture.numberOfTapsRequired = 2;
    [self.view addGestureRecognizer:tapGesture];
    [tapGesture release];

    // 長押し検知
    UILongPressGestureRecognizer *longPressGesture = [[UILongPressGestureRecognizer alloc]
                                                      initWithTarget:self
                                                      action:@selector(handleLongPressGesture:)];
    longPressGesture.minimumPressDuration = 0.5f;
    [self.view addGestureRecognizer:longPressGesture];
    [longPressGesture release];

    // スワイプ検知(Left)
    UISwipeGestureRecognizer *swipeLeftGesture = [[UISwipeGestureRecognizer alloc]
                                                  initWithTarget:self
                                                  action:@selector(handleSwipeLeftGesture:)];
    swipeLeftGesture.direction = UISwipeGestureRecognizerDirectionLeft;
    [self.view addGestureRecognizer:swipeLeftGesture];
    [swipeLeftGesture release];
}
// タップ検知時
- (void)handleTapGesture:(UITapGestureRecognizer *)sender
{
    [self showAlert:@"TapGesture"];
}
// 長押し検知時
- (void)handleLongPressGesture:(UILongPressGestureRecognizer *)sender
{
    [self showAlert:@"LongPressGesture"];
}
// スワイプ(Left)
- (void)handleSwipeLeftGesture:(UISwipeGestureRecognizer *)sender
{
    [self showAlert:@"SwipeLeftGesture"];
}
// アラート表示
- (void)showAlert:(NSString *)msg
{
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"確認ダイアログ" message:msg delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
    
    [alert show];
    [alert release];
}

上のサンプルはすべてコード上でジェスチャーを生成していますがXcode 4.2以降ではインターフェースビルダーを利用してGesture Recognizerを設定できます。

操作はオブジェクトライブラリ内の各ジェスチャーを対象のオブジェクトの上にドラッグ&ドロップします。
状況を確認するにはアウトラインを表示して対象のジェスチャー(Pan Gesture Recognizer)を右クリックすると接続状況が確認できます。

次にViewController.hにアクション用のメソッドを追加します。
- (IBAction)panGesture:(UIPanGestureRecognizer *)recognizer;

次にAsisstantEditorを開いてPan Gesture Recognizerと上で追加したメソッドを関連付けます。

あとはViewController.mにメソッドの処理を記述するとGesture Recognizerの実装が可能となります。



2012年3月28日水曜日

Storyboardを使った画面遷移と値の受け渡し 其の二

其の一では単純に画面遷移するアプリを作成しました。
このアプリを使って値を受け渡すように機能を追加していきます。

(1)カスタム・ビューコントローラの作成
メイン画面からサブ画面へ値を受け渡す場合はViewControllerクラスの「prepareForSegue:sender:メソッド」を使用します。
そのためにサブ画面用のビューコントローラクラスを作成しておきます。

Xcodeのメニューから「File」→「New」→「File...」を選択してカスタム・ビューコントローラクラスを作成します。
Templates
Objective-C Class
Class
SubViewController
Subclass of
UIViewController

(2)カスタム・ビューコントローラの設定
サブ画面の「ViewController」を選択して画面右のIdentity inspectorから先ほど追加した「SubViewController」を選択します。


今回のアプリではメイン画面で入力した文字をサブ画面で表示するアプリにしたいのでメイン画面とサブ画面に部品を貼付けていきます。

(3)メイン画面の修正
メイン画面に入力ボックス(TextField)を配置します。
配置したAssistant editorを使用して関連付けを行います。
Connection
Outlet
Name
aTextField
Type
UITextField
関連付けはこれで完了ですがそのままではキーボードが閉じません。
以前作ったページがあるのでこちらを参照にキーボードを閉じる処理を追加します。
iOSのソフトウェアキーボードを閉じる

(4)サブ画面の修正
メイン画面で入力した内容を表示するためにラベル(Label)を配置します。
同様にAssistant editorを使用して関連付けを行います。
Connection
Outlet
Name
aMessage
Type
UILabel
(5)サブ画面のプロパティを設定
メイン画面からサブ画面へ値を受け渡すためにSubViewControllerクラスにNSString型のプロパティ「msgValue」を設定します。

SubViewController.h
@interface SubViewController : UIViewController

@property (copy, nonatomic) NSString *msgValue;  // ← 追加
@property (strong, nonatomic) IBOutlet UILabel *aMessage;

@end

SubViewController.m
@implementation SubViewController
@synthesize msgValue;  // ← 追加
@synthesize aMessage;

// 途中省略

- (void)viewDidLoad
{
    [super viewDidLoad];
    // msgValueの内容をラベルに表示
    aMessage.text = msgValue;
}

(6)メイン画面から値を渡す
テキストエリアから入力した内容をサブ画面に渡します。

MainViewController.m
#import "SubViewController.h"

// 途中省略

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // サブ画面のビューコントローラを取得
    SubViewController *aSubViewController = (SubViewController *)[segue destinationViewController];
    // サブ画面のmsgValueプロパティに文字列を代入
    aSubViewController.msgValue = aTextField.text;
}

まず、MainViewControllerクラスでSubViewController.hをインポートします。
次に「prepareForSegue:sender:メソッド」をオーバーライドして処理を行います。

(7)実行
メイン画面の入力エリアに文字を入力して「Next」ボタンを押す

サブ画面のラベル部分に入力した文字が表示される

簡単にですがStoryboardでの画面遷移と値の受け渡しのサンプルアプリ完成です。


※Scene(シーン)とSegue(セグエ?)
Storyboardで画面レイアウト(ViewController)部分をScene、画面遷移の部分をSegue


Storyboardを使った画面遷移と値の受け渡し 其の一

Xcode4.2で追加されたStoryboardを少しだけ触ってみました。
(StoryboardはiOS5.0以上でしか動作しません)

とりあえず簡単な画面遷移と値の受け渡しするアプリを。

(1)Xcodeでプロジェクトを作成
Templates
Single View Application
Product Name
StoryboardSample
Class Prefix
Main
Device Family
iPhone
今回はStoryboardを使用するので「Use Storyboards」にチェックを付けます。


(2)ストーリボードのデザイン
まずProject Navigatorで「MainStoryboard.storyboard」を選択するとデザインの編集画面が表示されます。この画面に対するビューコントローラはMainViewControllerクラスになります。
ここに新しい画面を追加します。画面右のオブジェクトライブラリから「View Controller」をデザイン画面に配置します。
わかりやすいように画面にそれぞれラベル(Label)とボタン(Rounded Rect Button)を配置しています。

(3)画面遷移を設定する
次に「Next」ボタン、「Back」ボタンをクリックして画面遷移するように設定します。
まず、メイン画面に配置した「Next」ボタンを選択し、Controlキーを押しながらサブ画面へとドラッグします。そうすると下記画面のようなStoryboard Segueというダイアログが表示されます。

Push
ナビゲーションコントローラなどのスタック型
Modal
モーダルダイアログ型
Custom
オリジナルのSegueクラスを使用
ここでは「Modal」を選択します。
選択すると下記画面のようにメイン画面からサブ画面へ矢印が表示されます。
同じようにサブ画面に配置した「Back」ボタンをメイン画面に画面遷移するように設定します。

(4)ここまでで一度実行
ビルドしてシミュレータで実行。
「Next」ボタン、「Back」ボタンを押すと画面がロールアップして表示されます。
(画面に別々の背景色をつけるとわかりやすいかも・・・)
画面遷移の視覚効果を変更する場合は画面右のAttributes inspectorのTransitionで選択できます。

とりあえずこれでStoryboardを使った画面遷移ができました。
長くなりそうなんで値の受け渡しは其の二で。


2012年3月27日火曜日

ActionScriptで四捨五入

四捨五入/切り捨て/切り上げ
var val:Number = 5.6;

trace(Math.round(val));    // 四捨五入
// 結果:6

trace(Math.floor(val));    // 切り捨て
// 結果:5

trace(Math.ceil(val));    // 切り上げ
// 結果:6



小数点以下の四捨五入をしたい場合
function round(val:Number, digit:int = 0):Number {

    var pow:int = Math.pow(10, digit);

    return (Math.round(val * pow) / pow);

}




Flash Builder 4.5 リリースビルドの書き出しエラー

FBを使ってiPhone用のアプリを作成、実機で試そうと思ってリリースビルドしたらエラー。。。
(Mac だけ?Windowsではすんなりました)

Flash BuilderのApple iOS サポート用AIRがインストールされていません。
Apple iOS 用のパッケージ化サポートを有効にするには、この手順に従ってください。

「この手順」をクリックしたもの英語。。。
難しい内容ではありませんが、備忘録程度に

  1. Adobe AIR SDK をダウンロード http://www.adobe.com/products/air/sdk/
  2. ダウンロードしたファイルを解凍
  3. アプリケーションフォルダを開いて以下の通りコピーする
    コピー元 コピー先
    lib/aot/lib/gcc {application}/sdks/{version}/lib/aot/lib
    lib/aot/bin/as {application}/sdks/{version}/lib/aot/bin
    lib/aot/bin/strip {application}/sdks/{version}/lib/aot/bin
    lib/aot/lib/gcc {application}/utilities/ipa_packager/lib/aot/lib
    lib/aot/bin/as {application}/utilities/ipa_packager/lib/aot/bin
    lib/aot/bin/strip {application}/utilities/ipa_packager/lib/aot/bin
これで再度リリースビルドすると正常にipaファイルが作成されました。