2012年12月20日木曜日

CoreDataとsqlite

 。.:+:・'☆'゚ヽ(●‘∀‘)ノ・'.::+ハロー♪゚+'゚☆

iOSでsqliteを使う際、普段は自前のO/Rマッパーを使っているのですが、手続きが結構面倒なので(モデルクラスやコントローラークラスの自動生成機能があればいいんですけどね (´・ω・`))、
巷で使いづらいと噂のCoreDataに手を出してみることにしました! (`・ω・´) シャキーン






。。。 フムフム…φ(@Д@━)(勉強中)







こ、これは!!











OK、もう二度と使わない(ぉぃ

とまでは言わないですが標準のままでは確かに使いにくいですねぇ。。

マイグレーションに時間がかかるのが一番のネックな気がしますね。
ゲームアプリに使っちゃうとえらいことになりそうです。
ディスクにクエリ結果をキャッシュするのでクエリ自体はものっそ速いんですが。

そしてUIのコードと完全に分離出来るのはありがたいですが、
必要なクラスが無駄に多いので地味に戸惑います。

あとはこのテのフレームワークでありがちな実際のSQLとプログラムコードの解離性が気になります。
複雑なクエリを作りたい時に必ずハマりそうな気がするので。
(ちゃんと正規化しろって話ですけどね!)


まぁケースバイケースですねー。
ユーティリティのような小さいアプリ(データ量)でかつ
頻繁に参照、更新を行うようなものには非常に向いていると思います。

ちなみに生成されるSQLを出力したい時は
Argumentに
-com.apple.CoreData.SQLDebug 1
を追加しておけば出力されます。
(stmt状態なので、バインド変数は自前でログ出力して下さいませ)

ラップしたライブラリも多々存在しますので
その内試してみようと思います .:゚+(o・`ω・)

2012年12月18日火曜日

UIViewをtransformで回転させるときに気をつけること

例として、こんなラベルが定義されてるとして話を進めます。

UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(006030)];
label.text = @"ABCDE";
label.textColor = [UIColor whiteColor];
label.backgroundColor = [UIColor blueColor];


1.回転を行うとframeが変更される
次のようなコードで90度回転させるとします。
 
label.transform = CGAffineTransformMakeRotation(M_PI_2);

そうするとframeのCGRectは、

origine: x=15, y=-15
size: width=30, height=60

と変更されてしまいます。
また、対象が斜め向きになる角度(45度とか)で回転させると、回転後の対象がちょうど収まるCGRectに変更されます。

当然ですが、この時点で次のように元々と同じframeをセットしても回転状態はキープされているのでおかしな表示になっってしまいます。

label.frame = CGRectMake(00, 6030);


2.回転後にビューのサイズを変更する場合は、boundsを再設定するか一度回転をリセットしてframeを再設定する
これは必ずしもと言うわけではないのですが、そうしておくと分かりやすくなることが多いと思います。
というのも、1の通り回転後はframeが変更されているので、frameを再設定して正確にサイズを変えようと思うと、に再設定するCGRectのサイズを計算する必要が出てきます。
(多分三角関数的なアレになると思うのですがそこまで調べてはいません。)

label.transform = CGAffineTransformMakeRotation(M_PI_2/2);
label.bounds = CGRectMake(009030);

あるいは

label.transform = CGAffineTransformMakeRotation(M_PI_2/2);
label.transform = CGAffineTransformMakeRotation(0);
label.frame = CGRectMake(009030);
label.transform = CGAffineTransformMakeRotation(M_PI_2/2);

boundsの場合は中心位置がリサイズ前のままになり、リセット+frameの場合はリサイズ後の中心位置を基準に回転することになるので、その点は注意が必要です。


3.基準となるCGAffineTransformを指定しないと無回転状態を基準に回転する
連続して回転させる場合、以下のように現在のCGAffineTransformを基準として指定してやる必要があります。

label.transform = CGAffineTransformRotate(label.transform, M_PI_2)
label.transform = CGAffineTransformRotate(label.transform, M_PI_2)

以下のようにしてもずっと90度のままです。

label.transform = CGAffineTransformMakeRotation(M_PI_2);
label.transform = CGAffineTransformMakeRotation(M_PI_2);

transformに保持しているCGAffineTransformを設定し直すので当然と言えば当然ですね。


2012年12月12日水曜日

UIWindowは回転しない

iOSアプリ開発、Mac使用歴共に4ヶ月と少しのの社員4です。
わからないことだらけのiOS SDKやXCodeと日々格闘しております。
そんな中で気づいたことを書き留めていこうと思います。

さて表題の件ですが、アプリの画面回転を有効にしている場合、rootViewControllerのviewは自動的に回転してくれるのですが、windowは回転してくれません。
ですので、windowになんらかのviewを直接addsubviewしている場合は、viewを個別に回転させたり、回転に応じて座標を変換する必要があります。


検証環境はXCode4.5とiOS4.3、5.1、6.0です。(いずれもシュミレータ)



検証用コード
-(void)viewDidAppear:(BOOL)animated
{
    self.view.backgroundColor = [UIColor clearColor];
    
    UIView *markerV = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
    markerV.backgroundColor = [UIColor blueColor];
    [self.view addSubview:markerV];
    
    UIView *markerW = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 30, 30)];
    markerW.backgroundColor = [UIColor redColor];
    [self.view.window addSubview:markerW];
}

chromeのブックマーク検索

 コン━━(。・∀・)ノ゙━━チャ

寒い日が続きますねー。
ホットコーヒーの摂取量が日増しに増えていっている気がします (・ω・ ;)(; ・ω・)

で、タイトルのお話。

新しい技術情報を見つけた際に
とりあえずブックマークはするんですが、
フォルダ分けや整理が思いのほか面倒でして (´・ω・`)

本当に必要なものは社内wikiに転記しますが
そこまでではないなと思うものがchromeのブックマークバーに
大量に積み重なって、もはやブックマークの意味を成さないレベルにまで
肥大してしまいました。。

そこであるんじゃないかなーと探してみたところ
やっぱりあったよブックマーク検索アプリ!

https://chrome.google.com/webstore/detail/search-on-bookmark/ebalpcfngdhkpndfognjoffolfpiilnm?hl=ja

シンプルですが、この機能で十分満足ですヽ(*´∀`)/
こまめに整理が出来ない人は是非お試しあれ。

2012年12月10日月曜日

Retinaディスプレイでの画面キャプチャ


 (=゚ω゚)ノ ぃょぅ!

手書きアプリ内で不思議に思った点があったので記載
画面キャプチャをする時に以下のコードを使ったのですが

UIGraphicsBeginImageContext(self.bounds.size);

お、 グググッ ゙┗(;゚`д´゚;)┛゙ オモ━ッ!!

iPad miniならまともに動きましたが
Retina端末ではまともに動きませんでしたorz

すったもんだ色々調べた結果以下のコードになったのですが。。

if (UIGraphicsBeginImageContextWithOptions) {
  UIGraphicsBeginImageContextWithOptions(self.bounds.size, NO, 0);
}else{
  UIGraphicsBeginImageContext(self.bounds.size);
}

不思議なのがUIGraphicsBeginImageContextWithOptionsの第三引数はscaleで
0にすると端末により自動最適化されるらしいのですが、
オプションなしのコードと同じになるはずと書いてありました(´・ω・`)ゼンゼンチャウガナ
調べたところが悪かったのでしょうか。。

思った通りの動作は実現出来たのですが、何となく気持ち悪い感じです (´・ω・`(´・ω・`(´・ω・`)


2012年12月7日金曜日

手書きロジックに苦戦中。。

手書きメモアプリ作成中なのですが、
手書きのアルゴリズムに苦戦中 (・ω・ ;)(; ・ω・)

スプライン補間やらの曲線補間も色々試しましたが
3次のベジェを補正するのが今のところ一番ですね (*´∀`*)b.:゚+♪

あとはリニアに線の太さを調整しないといけないんだけど
自然な感じにならない。。
他のアプリ見てると共通のアルゴリズムがあるっぽいなぁ (´・ω・`)
誰か教えてください ヽ(TДT)ノ

以上です!編集長!!

2012年12月5日水曜日

スバコラボのブログはじめました

おはようございます。

スバコラボの社員が色々と持ち回りで技術的な事やら最新ガジェットの事やら好きなことを書いて書いて書きまくるブログを始めました。

まあ、会社Webページ自体がbloggerなので元々ブログなんですが、あちらはリリース関連の事を書くということで、こちらは適当に何でもありで書いていきます。

それではまた。