2012年2月27日月曜日

CALayerのsublayer達を初期化する方法

RandomReelの改修中にCALayerに乗せたsublayer達を初期化しようとしたのだが
下手に考えすぎて
for (CALayer* sublayer in [superLayer sublayers]) {
    [sublayer removeFromSuperlayer];
}
とかやっても駄目だった。
ググったら海外にも同じことやった人がいた。

http://stackoverflow.com/questions/2067578/removing-all-calayers-sublayers

というわけで
superLayer.sublayers = nil;
だけでいいのね。
冷静に考えれば確かにそれでsublayer達はreleaseされるのか。

2012年2月26日日曜日

「プログラミングで溜まったストレスをプログラミングで解消できるか?」という実験

目下、間近に迫ったリリースに向けて壮大なバグ取りを休日返上で行なっているところですが、そんな中、プログラミングで溜まったストレスをプログラミングで解消してみようじゃないかという実験を始めています。そう、迎え酒です。私はお酒は飲めません。

このガチガチに決められたもの追い立てられながら作るという作業のストレスを、自分で考えた自分の好きにしていいものをみんなに届けたいという気持ちから作るという創作活動で上塗りしてしまおうではないかと、そういう発想です。

多忙な時というのは、得てして脳が活発な時でもあります。たぶん。いや、半分死んでいるともいえますが。なんか勢いはあります。ある気がします。このプロジェクトが終わると脱力して燃え尽きて真っ白になってゲームを始めてダメ人間に戻るのは眼に見えています。
だから今なのです。

先日、ふと簡単なアプリを思いついたので勢いで作ってみようとコチラの投稿でも言いましたが、これをこのクソ多忙な仕事と並行して作ります。いや、もう作ってます。思った通りわりといい感じです。さっさと仕事を終わらせて創作に着手したいというモチベーションがいい感じにはたらいて仕事にも力が入ってしまうという微塵も予想しなかった効果もでている気がします。

さて、そうこう言っているうちに仕事が架橋に入って全然創作活動の方ができなくなってきたこの月末。はたして両方無事にリリースできるのか!?


2012年2月24日金曜日

AnimationDrawableを使うときの注意点

Androidネタです。 
複数画像を使ったパラパラアニメを作るために使うAnimationDrawableですが、なかなかのクセモノです。 

その1

Activityの起動と同時にアニメーションを開始したい場合は、onWindowFocusChangedでstartしてやらないと動きません。
そう、onCreateやonResumeでstartしてもビクともしません。
これは、その時点ではAnimationDrawableが画面上に準備できてないからです。

その2

startしたらstopしましょう。
そう、stopではなく描画の関係で止まったアニメーションを再開させようとstartを再度呼んでもビクともしません。 startの前にstopするようにしたらいいんじゃないっすかね。

その3

ActivityGroupなどを使っていると画面遷移で止まったりします。
そう、この時はonWindowFocusChangedが呼ばれないためビクともしません。
これは、別スレッドを利用して回避できるようです。
onResumeで
runOnUiThread(new Runnable() {
 @Override
 public void run() {
  animation.start();
 }
});
とかしてやると動きます。
注:どっかでstopしてね。

以上です。

2012年2月22日水曜日

RandomReel 1.0.1 リリース

RandomReelをアップデートしました。
ご利用いただいている方はAppStoreからアップデートをお願いいたします。


バージョンアップ内容

  • 日本語ローカライズ
  • 登録したリストが消えてしまうことがあるバグ対応

以上です。


サポートページはコチラ
http://hayate-works.blogspot.com/2012/01/randomreel.html

2012年2月21日火曜日

WebViewのclearHistoryで履歴が消えない件


AndroidのWebViewを使ってて
いくらclearHistory()呼んでも全然履歴が消えないと思ったらこういうことでした。

「1ページ読み込んだあとに呼ばないと消さないよ。」

例)ページAを表示後、ページBを表示する
【間違ったやり方】
 1.Aをロード
 2.Bの読み込み前にclearHistory()
 3.Bをロード
 履歴は消えません。この時点での履歴:B、A

【正しいやり方】
 1.Aをロード
 2.Bをロード
 3.Bの読み込み完了後、clearHistory()
 Aの履歴が消えます。この時点での履歴:B

WebViewClientのonPageFinishedで呼んでやると、きれいに消してくれました。

よく考えてみると、確かにこの順番でやるのが正しい。
そうならそうとリファレンスに書いといてくれてもいい気がする。

2012年2月20日月曜日

Toastの中のテキストをセンタリングする

最近はAndroidアプリを作っているわけですが、Toastの中のテキストをセンタリングする方法をメモっときます。

Toast自体のセンタリングは
setGravity(gravity, xoffset, yoffset)
でできるわけですが、中のテキストは簡単にできそうにありませんでした。
そこで、調べてみると、デフォルトのToastは
-LinearLayout
-TextView
という構成になっているようなので
((TextView)((LinearLayout)toast.getView()).getChildAt(0))
.setGravity(Gravity.CENTER_HORIZONTAL);
でセンタリングできるみたいです。
とても汚いですが・・・。

もしくは、自前でレイアウトを作成してsetView(view)してカスタム化してあげるか。
その場合はIDを"toast_layout"にしないといけないらしい。
その辺の詳細はコチラ


2012年2月16日木曜日

Xcode4.2でローカライズした際の問題について

Xcode4.2でローカライズしたプロジェクトをよくみると
japaneseのファイルが絶対パスに設定されています。

ローカライズで追加された(japanese)付きのファイルを選択して
右側ペインのFile InspectorタブのIdentityにあるLocationを見ると
"Absolute Path"になってて変更できない。

これをこのままにして、プロジェクトフォルダを別の場所に移動させようものならビルドができなくなります。
ソース管理等で別のパスにCheckOutとかしても。

これの対策方法は以下を参考にさせていただきました。

http://d.hatena.ne.jp/s-0samu/20111025/1319526335

ありがとうございました。