2014年4月23日水曜日

iOS 7.1 UITabBar タブをドラッグすると、タブに設定してある画像が縮小したりする

iOS7.1からの(おそらく)バグです。
タブを使用していて、各タブに画像を指定している際に、
そこをダブルタップしたりドラッグしたりすると、
勝手に画像が縮小されたりリサイズされるという現象が起こりました。


いろいろ調べてみて、発生する条件が判明。
Storyboard、コードのいずれかで、imageのinsetを指定していて、
例えばTopが10, Bottomが-3などのように、上下または左右の合計が0にならないときに
発生するようです。
例:
(OK)
  Top:0 Bottom:0 Left:0 Right:0  Top:5 Bottom:-5 Left:0 Right:0
  Top:3 Bottom:-3 Left:3 Right:-3

(NG)
  Top:10 Bottom:-3 Left:0 Right:0  Top:0 Bottom:0 Left:3 Right:3
  Top:5 Bottom:5 Left:0 Right:0

そもそもなぜここを指定していたかというと、画像ファイルを適当なサイズで作って、
この値をいじって、ちょうどいい表示サイズにしていたからです。
そこで、元々
Top:8 Bottom:-4 Left:3 Right:3
だったのを、
Top:5 Bottom:-5 Left:0 Right:3
にして、今度は画像ファイル自体をちょうどいいサイズに変更したところ、
ドラッグしても反応しないようになりました。

以上です。

2014年4月14日月曜日

Cocos2d-x (C++) SQLite3 Use column name instead of column index - クエリの結果をインデックス番号ではなくインデックスカラム名で検索

最近、Cocos2d-xを始めようと思い、まずはデータベース周りから整えようと、
sqlite3の実装をやっています。

C++では当然Objective-C用のFMDBが使えないので、
C言語に近いところでの操作が必要になります。

sqlite3自体は、
http://www.sqlite.org/download.html
からダウンロードしてプロジェクトに加えます。

で、いろいろとやって、とうとうSelect文を実行する段階に。
しかし、sqlite3の関数を探してみても、クエリの結果から値を取り出す際に、
下記関数のような、コラムのindexで指定するものしか見当たりませんでした。

sqlite3_column_int(sqlite3_stmt *stmt, int i)

この方法だと、Objective-Cから移植する際に面倒くさいので、
無理矢理カラム名からやる様にしてみました。

std::vector<cocos2d::Value>  allRecord = std::vector<cocos2d::Value>();
    sqlite3 *db = this->getDB();
    if (!db) {
        return allRecord;
    }
    sqlite3_stmt *stmt = NULL;
    std::string sql = "SELECT * FROM table1";
    if (sqlite3_prepare_v2(db, // db
                           sql.c_str(), //sql
                           -1, //バイト長
                           &stmt, //ステートメントハンドル
                           NULL) == SQLITE_OK) {

        //indexとcolumn nameの対応
        std::map<std::string, int> map;
        
        while (sqlite3_step(stmt) == SQLITE_ROW) {
            if (map.size() == 0) {
                for (int columnIdx = 0; columnIdx < sqlite3_column_count(stmt); columnIdx++) {
                    dict[sqlite3_column_name(stmt, columnIdx)]=columnIdx;
                }
            }
            
            std::vector<cocos2d::Value> records = std::vector<cocos2d::Value>();
        
            //0
            records.push_back(Value(sqlite3_column_int(stmt, map["id"])));
            
            //1
            const unsigned char *str = sqlite3_column_text(stmt, map["name"]);
            if(str){
                records.push_back(Value(""));
            }else{
                records.push_back(Value(str));
            }
            
            allRecord.push_back(Value(records));
        }
    }
    sqlite3_reset(stmt);
    sqlite3_finalize(stmt);
    sqlite3_close(db);
    

    return allRecord;

*getDBは、DBファイルを指定したsqlite3変数を返す自作のメソッドです。
*データは、"id"と"name"の2列です。
*それぞれの行ごとの配列(Vector)と、それをまとめる配列の二次元配列にしています。

何をしているかというと、
mapにインデックス番号とカラム名を関連づけて保存し、
そこからカラム名を使ってインデックスを指定できるようにしただけです。

他にもいい方法があるかもしれませんが、自分にはこれで十分でした。

以上です。

2014年3月9日日曜日

M2TECHのHiFaceをOS 10.9 marvericksで使う

MacからHiFaceというDDCでUSB→S/PDIF同軸に変換していますが、
HiFaceのドライバーがmarvericksに非対応なので、M2TECHの更新を待つこと数ヶ月。
全然更新が来ないので、何か方法がないか調べてみました。

↓参考にしたフォーラム(この辺から最後まで)
http://www.computeraudiophile.com/f11-software/m2tech-hiface-mavericks-problem-18072/index4.html

↓方法
https://gist.github.com/huyhong/8323746

要するに、別のドライバーで代用して動かせるとのこと。
詳しい手順が書いていて助かった。