TONY0922のブログ

学んだことを適当に記録していくブログです。主にRuby, Java, PHPで仕事してます。更新頻度はそんなに高くないので、ご了承下さい。

レベルアップObjective-C を読んだ。

レベルアップ Objective-C (Software Design plus)

レベルアップ Objective-C (Software Design plus)

【対象】
初心者 ~ 中級者向け対象

【感想】
Xcodeの基本的な使い方やデバッグのやり方が
丁寧に記載されていて、知らない箇所も多くあったので、非常に有用だった。
メモリ管理やマルチスレッドに関してもわかりやすく書かれているので、
機会を作ってもう一度、見直す予定。

Titanium MobileのAlloyでControllerで作成したViewにtssの定義を適応させる。

Titanium SDK:3.2.0
Alloy:1.3.0

Controllerで作成したViewはそのままだと
tssで定義したclassを当てはめることができないので、
Dynamic Styleを使うと良い。

index.tss

// Button全てに以下の定義が適用。
"Button" : {
	backgroundColor : "black"
}
".buttonEnabled" : {
	opacity : 1.0,
	touchEnabled : true
}
".buttonSize" : {
	width : "50dp",
	height : "50dp" 
}

index.js

var button = Ti.UI.createButton();
var style = $.createStyle({
	apiName : "Button" // tssの「Button」を指定。
	classes : ["buttonEnabled", "buttonSize"] // 複数のClassを指定。
}); 

button.applyProperties(style); // tssのクラスが適用される。

【参考URL】
http://docs.appcelerator.com/titanium/3.0/#!/guide/Dynamic_Styles

Titanium MobileでAlloyでアプリ名を日本語にする

Titanium SDK:3.2.0
Alloy:1.3.0

・プロジェクトのappフォルダと同階層に「i18n」フォルダを作成
i18n/ja/app.xmlを作成。
・app.xmlを編集

<?xml version="1.0" encoding="UTF-8" ?>
<resources>
	<string name="appname">日本語アプリ名</string>
</resources>

これで、ビルドするとiOSAndroidの両方でアプリ名が日本語になります。

Titanium MobileのiOS用スプラッシュ画像はちゃんとしたpng拡張子を使おう

お前は何を言って(略

Titanium MobileでiOS用のスプラッシュ画像を使うために
gifファイル用意してたんだが、pngしか設定できないようなので、
拡張子をリネームして、下記のファイルを設定した。

Default.png
Default-568h@2x.png
Default@2x.png

iOS Simulatorは指定したインチに沿って、
使用するスプラッシュ画像を選択してくれてたんだけど、
いざ、実機で確認すると「Default-568h」を
使用すべきところを「Default」しか使ってくれず、
そのおかげで、アプリ自体、640 × 960 サイズになって、
上下に黒い部分の領域ができてしまっていて、この解消方法がわからなかった。

解消方法は素直に
gifpng にちゃんと画像変換すれば、設定出来ました。

今考えると、拡張子リネームしただけで、変換できるか!!って言われそうだけど、
寝てなかったから頭が回ってなかったんです。(言い訳)

Titanium Mobileで親Viewにイベント伝搬させない

Titanium SDK:3.2.0
Alloy:1.3.0

親Viewと子Viewに同じClickイベントを設置した時、
デフォルトでは子ViewのClickイベント後、親Viewのclickイベントが発生します。

var parentView = Ti.UI.createView({
	height : Ti.UI.FILL,
	width : Ti.UI.FILL
});

parentView.addEventListener('click', function(e){
	console.log("parent click!");	
});

var childView = Ti.UI.createView({
	height : Ti.UI.FILL,
	width : Ti.UI.FILL
});

childView.addEventListener('click', function(e){
	console.log("child click!");	
});

parentView.add(childView);

click時

child click!
parent click!

これを制御するには、bubbleParentプロパティを制御します。

var childView = Ti.UI.createView({
	height : Ti.UI.FILL,
	width : Ti.UI.FILL,
	bubbleParent : false
});

click時

child click!

これで親プロパティのイベントが発生させないようにできます。

Titanium MobileでBase64でエンコードされた画像を表示。(Android/iPhone)

Titanium SDK:3.2.0
Alloy:1.3.0

サーバーからBase64エンコードされた画像データを表示したかったのだが、
AndroidiPhoneでハマったので、メモ。

// 画像取得先のURL(仮のもの)
var url = "http://hogehoge.com/getImage";

var xhr = Ti.Network.createHTTPClient({
	onload : function(e) {
		// レスポンスは{"img_string" : "Base64でエンコードされた文字列"}で返ってくるものとする。
		var response = JSON.parse(this.responseText);
		var img = Ti.UI.createImageView({
			image : Ti.Utils.base64decode(response["img_string"]),
			width : Ti.UI.FILL
		});

		// 以下、imgを画面に表示する処理を書く。






	},
	onerror : function(e) {
			// 失敗した時の処理
		},
		timeout : 3000 // 3秒経過したら、タイムアウト
	});
xhr.open("GET", url);
xhr.send();

ここで注意したいのは、最初、createViewのbackgroundImageで
表示しようと思ってたのだが、何故かandroidでは表示できなかった。

Ti.UI.createView({
	backgroundImage : Ti.Utils.base64decode(response["img_string"]),
	width : Ti.UI.FILL
});

仕方ないので、createImageViewでやったら、AndroidiPhoneの両方で
うまくいったので参考までに。

[追記]
・ImageVIewのimage
http://docs.appcelerator.com/titanium/3.0/#!/api/Titanium.UI.ImageView-property-image

・ViewのbackgroundImage
http://docs.appcelerator.com/titanium/latest/#!/api/Titanium.UI.View-property-backgroundImage

ちゃんと、使用できる型決まってるわ。
リファレンスはしっかり見ないと(反省)

Titanium MobileのSQLite3でBooleanを使用する際の注意点(Android/iOS)

Titanium SDK:3.2.0
Alloy:1.3.0

SQLite3のカラム型でBoolean型は存在しないので、
代わりにInteger型を使用することになると思うのですが、
iPhoneだとtrueを設定しても、SQLiteでは自動的に「1」が登録されます。

しかし、Androidでは自動的に変換は行われず、
nullになってしまうので、注意が必要です。

素直にtrueなら1、falseなら0を使うようにしましょう。