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月23日水曜日
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で指定するものしか見当たりませんでした。
この方法だと、Objective-Cから移植する際に面倒くさいので、
無理矢理カラム名からやる様にしてみました。
*getDBは、DBファイルを指定したsqlite3変数を返す自作のメソッドです。
*データは、"id"と"name"の2列です。
*それぞれの行ごとの配列(Vector)と、それをまとめる配列の二次元配列にしています。
何をしているかというと、
mapにインデックス番号とカラム名を関連づけて保存し、
そこからカラム名を使ってインデックスを指定できるようにしただけです。
他にもいい方法があるかもしれませんが、自分にはこれで十分でした。
以上です。
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
要するに、別のドライバーで代用して動かせるとのこと。
詳しい手順が書いていて助かった。
HiFaceのドライバーがmarvericksに非対応なので、M2TECHの更新を待つこと数ヶ月。
全然更新が来ないので、何か方法がないか調べてみました。
↓参考にしたフォーラム(この辺から最後まで)
http://www.computeraudiophile.com/f11-software/m2tech-hiface-mavericks-problem-18072/index4.html
↓方法
https://gist.github.com/huyhong/8323746
要するに、別のドライバーで代用して動かせるとのこと。
詳しい手順が書いていて助かった。
2014年1月22日水曜日
Cocos2dとMKMapViewとOpenGLについて([[CCDirector sharedDirector]pause];)
Cocos2d for iPhoneを使用していて、iPhone標準のMapViewを表示するときの注意点です。
Mapを表示している間は、可能ならば
MapViewを表示する際は、下記コードで実現できます
(mapViewはメンバーにしています。
問題は、少し前のOS、具体的にはMKMapViewで呼び出されるのがGoogleMapのものでは、
地図が表示されなかったり、拡大縮小、移動がかくついたりする現象がありました。
それも毎回おこるわけではなく、再表示で直ったり直らなかったりで原因がよくわかりませんでした。
いろいろ考えた結果、そういえばGoogleMapってOpenGL使ってるのではと思いだしました。
もしやCocos2dとGoogleMapでOpenGLが競合して表示が変になっているのでは…
そこで、Map表示時に、Cocos側の描画処理を止める
[[CCDirector sharedDirector]pause];
を呼び出してみました。
すると、何回ためしてもMap側の表示がおかしくなる現象が見られなくなりました。
Mapの動作がいらなくなったり、Cocos側のアニメーションや画面遷移が必要になったタイミングで、
GoogleMap以外にも、OpenGLを使っているAPIを使用している方は、
参考になるかもしれません。
以上です。
Mapを表示している間は、可能ならば
[[CCDirector sharedDirector]pause];
をしといたほうがいいです。MapViewを表示する際は、下記コードで実現できます
(mapViewはメンバーにしています。
CGRect frame = CGRectMake(50, 45, s.width - 100, s.height - 100);
self.mapView = [[[MKMapView alloc] initWithFrame:frame] autorelease];
_mapView.backgroundColor = [UIColor clearColor];
_mapView.mapType = MKMapTypeStandard;
_mapView.delegate = self;
[_mapView setShowsUserLocation:YES];
[[[CCDirector sharedDirector] view] addSubview:_mapView];
問題は、少し前のOS、具体的にはMKMapViewで呼び出されるのがGoogleMapのものでは、
地図が表示されなかったり、拡大縮小、移動がかくついたりする現象がありました。
それも毎回おこるわけではなく、再表示で直ったり直らなかったりで原因がよくわかりませんでした。
いろいろ考えた結果、そういえばGoogleMapってOpenGL使ってるのではと思いだしました。
もしやCocos2dとGoogleMapでOpenGLが競合して表示が変になっているのでは…
そこで、Map表示時に、Cocos側の描画処理を止める
[[CCDirector sharedDirector]pause];
を呼び出してみました。
すると、何回ためしてもMap側の表示がおかしくなる現象が見られなくなりました。
Mapの動作がいらなくなったり、Cocos側のアニメーションや画面遷移が必要になったタイミングで、
[[CCDirector sharedDirector]resume];
を呼び出せば、自分のアプリの場合は特に問題なく実装できました。GoogleMap以外にも、OpenGLを使っているAPIを使用している方は、
参考になるかもしれません。
以上です。
違う環境に移した時の clang: error: linker command failed with exit code 1 (use -v to see invocation)
久しぶりの更新です。
Xcodeのプロジェクトを、丸ごと持ち運んで別々の環境でコーディングする人も居ると思います。
自分も最近よくやっているのですが、その際に追加しているライブラリが原因で下記エラーが出てしまいました。
d: warning: directory not found for option 'パス'
clang: error: linker command failed with exit code 1 (use -v to see invocation)
原因は、ライブラリのパスが絶対パスになっており、
違うMacに移したことでそのパスにたどり着けないことによります。
自分の場合の解決法としては、ライブラリファイルをプロジェクトフォルダにコピーしてあるので、
TARGET→Search PathsのSettingのところを探して、
絶対パスで指定してあるところを相対パスに置き換えました。
/Users/(ユーザー名)/.../(プロジェクトフォルダ名)/
これを
$(SRCROOT)
に置換してやるとエラーがでなくなりました。
以上です。
登録:
投稿 (Atom)