環境の最近のブログ記事

こんにちは。開発担当のICTFです。

先日、開発中のプログラムを実機で動作確認する為にXcodeから転送を行ないました。
普段はこれだけで実機側でアプリが起動するのですが、今回はなぜかどれだけ待っても起動しません。
その上Stopボタンを押してプログラムの停止を指示しているのに、一向にXcode側も終了してくれないのです。
結局デバイスをPCから取り外すしか手段はありませんでした。

何が間違っているのか分からないままXcodeやPCの再起動を行なったのですが、まったく改善しません。
この現象が発生するのはあるデバイスのみで、他のデバイスでは正常に実機で動作確認できるのです。
もう一点関係ありそうな点として、問題の実機(iPhone4s)はこのところ妙に動作が重く、アプリを1つ消すのにもプチプリーズしているような状態でした。

読者の皆さんはこの現象の原因は何であると予想されるでしょうか。











ーーーーーー
実際解決してみると「ああこんな事なのか」といった内容ですが、原因は単なる「デバイス側の容量不足」でした。
残容量を確認してみるとまったく残っておらず、試しにインストールしているアプリを手当たり次第に消去したところ問題を解決する事ができました。
こんにちは。開発担当のICTFです。

他のプロジェクトで使っていたクラスを新プロジェクトにコピーしたらビルドが通らなくなった、なんて経験はありませんか?
そういったビルドエラーの中でも多いのが「一緒にコピーしたはずのヘッダーファイルが見つからないエラー」ではないでしょうか。
理由は簡単で、コピー元プロジェクトで設定されていたヘッダーファイルへのパスがコピー先プロジェクトに存在しなかったからです。
「ヘッダーファイルのパスを通す」とは、コンパイラに「このフォルダにヘッダーファイルを入れておくので、ビルド時にチェックしてね」ということを意味します。
今回は、XCodeでヘッダーファイルのパスを通す方法を紹介しようと思います。

1. プロジェクトファイルを選択し、Build Settingsタブをクリックして下さい。
画像1

2.Build Settingsの一覧が表示されますので、Search PathsカテゴリのHeader Search Pathsという項目を見つけて下さい。

3. Header Search Pathsをダブルクリックすると項目の編集画面が開きます。
 編集画面で+ボタンをクリックすると項目が追加されますので、そこにパスを入力して下さい。
 ※パスはダブルクォーテーションで括りましょう。

これで完了です。
XCodeはGUIで設定を行なえる点は便利ですが、目的の項目を探し出すのに苦労しますね。
こんにちは。開発担当のICTFです。

今回はカスタマイズしたUITableViewCell(サンプルとしてUISwitchを加えたもの)をUITableViewに追加した場合の、セル上にあるスイッチが切り替わった事をTableView側で感知する方法をご紹介しようと思います。

まずこのようなカスタマイズUITableViewCellを作ります。
0001.png
カスタマイズしたUITableViewクラスの名称は、「SwitchCell」とします。
SwitchCellクラスのヘッダファイルは次のようになります。

@protocol SwitchCellDelegate


// スイッチの切換えを通知する

-(void) tableView:(UITableView*)tableView changeSwitchValue:(BOOL)on indexPath:(NSIndexPath*)indexPath;


@end


@interface SwitchCell : UITableViewCell

{

id _delegate;

}


@property (nonatomic, assign) id<SwitchCellDelegate> Delegate;


@property (nonatomic, retain) IBOutlet UISwitch* ValueSwitch;

@property (nonatomic, retain) IBOutlet UILabel* Title;


// スイッチの値が変更されたときのコールバック

-(IBAction) changeSwithValue:(id)sender;


@end


InterfaceBuilderでセルの設計を行なった場合、セル上に配置した各オブジェクトをプロパティに関連づけてください。
例ではUISwitchをValueSwitchに関連づけました。

次に、スイッチを切換えた時にコールするデリゲートメソッドをプロトコルとして実装します。
プロトコル名は「SwitchCellDelegate」、デリゲートメソッドは「-(void) tableView: changeSwitchValue: IndexPath」としました。
デリゲートとしてコールする事になりますので、SwitchCellクラスにデリゲートを保持する為の変数を追加する必要があります。
メンバ変数に_delegate、_delegateに関連づけるプロパティを追加しています。

実際にスイッチが切換えられた時にコールされるメソッドが「-(IBAction) changeSwitchValue:」です。
changeSwitchValueの実装は次のようになります。

// スイッチの値が変更されたときのコールバック

-(IBAction) changeSwithValue:(id)sender

{

// スーパークラスをたどり、このセルを保持するテーブルビューを探す

id tableView = [sender superview];

while ([tableView isKindOfClass:[UITableView class]] == NO) {

tableView = [tableView superview];

}

// NSIndexPathを得る

NSIndexPath* indexPath = [((UITableView*)tableView) indexPathForCell:self];

// デリゲートメソッドをコールする

[_delegate tableView:tableView changeSwitchValue:self.ValueSwitch.on indexPath:indexPath];

}


引数に自身が配置されているUITableViewと、自身を指すNSIndexPathを設定する必要があります。
UITableViewは自身の親となるビュークラスを辿ってゆき、UITableViewを見つけています。
見つけたUITableViewのindexPathForCellメソッドを用い、自身のNSIndexPathを取得します。
後はデリゲートメソッドをコールすれば、SwitchCellとしての役割は終了です。

次にSwitchCellを表示するUITableViewを保持するクラスに対し、修正を加えます。
例ではUITableViewControllerを継承した「SCR_MNU_005_SettingIndex」というクラスで紹介します。
先ほど作成したSwitchCellDelegateを採用します。

@interface SCR_MNU_005_SettingIndex : UITableViewController

<SwitchCellDelegate>

{

...

}


デリゲートとしてSCR_MNU_005_SettingIndexを登録する必要がありますので、SwitchCellを生成する箇所(恐らく- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath内になると思います)に以下の処理を追加します。

cell.Delegate = self;


最後に実際に受け取るデリゲートメソッドの実装を行ないます。

-(void) tableView:(UITableView *)tableView changeSwitchValue:(BOOL)on indexPath:(NSIndexPath *)indexPath

{

CategoryInfo* category = [_categoryList objectAtIndex:indexPath.section];

CellInfo* cellInfo = [category.CellList objectAtIndex:indexPath.row];

NSLog(@"ログ表示: [%@]", on?@"ON":@"OFF");

}


CategoryInfoとCellInfoクラスについて詳しい紹介は省きますが、データソースを管理するクラスです。
indexPathから該当するデータソースを抽出し、通常のコールバックメソッド同様、様々な処理を行なう事が可能です。

同じ作り方でUIButtonやUISliderのイベントを感知する事ができますので、応用してみて下さい。
こんにちは。開発担当のICTFです。

前回のUltraStudio3Dを使った動画撮影の報告を兼ねます。
予定より早くLaCie Little Big Disk Thunderboltが届きましたので、早速撮影してみました。
この時の設定が、無圧縮(1分の撮影で8GBくらいのサイズになりました)での撮影です。
前回ガクガクだった動画は新しいHDDを使う事で滑らかな動きになりました。
しかし、音声の方が4分を超えた当たりからブツブツというような音になり、やがて無音になってしまいました。これでも書き込み速度が足りなかったようです。

他の解決策が無いかと探してみたところ、どうやら一般的にはResProなどの規格で圧縮しながら撮影するようです。
圧縮してからHDDに記録すれば転送速度もそれほど必要ないですもんね。
ということで、ResPro規格で撮影する為さらにFinal Cut Pro XとCompressorを購入しました。
インストール後にBlackMagic Media Expressを起動し環境設定を開いたところ、ResProの項目が増えていました。

ResPro+LaCie Little Big Disk Thunderboltの組み合わせでなんとか違和感の無い動画が撮れました。
以下のリンクがその動画です。


今後30面クリアあたりまでの動画を順次アップしていきますので、宜しければご覧ください。
こんにちは。開発担当のICTFです。

開発したゲームの動画を撮る為にUltraStudio3DをMacBookProに繋いで録画してみました。
実はUltraStudio3D自体は2週間ほど前に手に入れていたのですが、どうしてもiPadの画像がPC側に表示されず、諦め&忘れていました。
今日思い出しついでに何か状況が良くなるかと再チャレンジしてみたら、なんとすんなり画像がPCに表示されます。ちなみに何も設定は変えていません。
iPadを接続し直したらまた画面が映らなくなったりと、設定項目以外の要素で映ったり映らなかったりするようです。なかなか癖が強いというか、扱い辛いですね。

折角無事映ったので試しにプレイ動画を録画してみたのですが、画面はガクガクしているし、音楽は途切れ途切れだし、ひどい有様でした。
どうやら内蔵のHDDでは書き込みの速度が全然足りていないようです。

速いHDDが必要になりましたので、AppleStoreでLaCie Little Big Disk ThunderboltというThunderbolt対応のHDDを買ってみました。
読み書き速度は最高175MB/sとかなり高速のようです。
到着まで5週間ほど掛かりそうですが、到着次第録画してみようと思います。