だいたい47度

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

PageTop

paperoの紙スクーターを作ったら楽しかった

Paperoという会社が出しているペーパークラフトに挑戦してみた。

色々種類があるみたいだけど、カップルスクーターに挑戦。franc francで買って2,800円だったかな。色違いのスクーターが2つ入っていた。

こんな感じで紙からパーツをプチプチとってくる。
P3162903.jpg

説明書通りに組み合わせ。細かい作業……。
P3162905.jpg

余裕がなくて撮るの忘れたけど、タイヤを作るのがとても大変。軸を嵌めこむのにはピンセットが必須!

で、完成!
P3162964.jpg

だいたいiPhoneくらいの大きさ。一台作るのに1.5時間くらい。二台作るのは精神が折れるので、誰かと一緒に作るのがよさそうですね。

だんだんFranc francの店頭からはなくなっていってしまっているみたい。Franc francの通販サイトならまだ扱っているのかな。本家から取り寄せると販売自体は18€くらいだけど、買えるのかどうか調べてないです。

棚に飾ってみると、なかなかいいかも!他にもバスとか飛行機とかあるみたいだけど、結構難易度高そうだなぁ。

スポンサーサイト

PageTop

iOSデータベース周りの本を読んでみた(1) Professional iPhone and iPad Database Application Programming

せっかくだからゲーム以外のアプリも作ってみようと思いましたが、その場合、コンテンツに魅力がないと面白くなさそうです。基本的な動きはゲームよりも簡単ですし。

そのためデータベース連携周りを学習することにしました。この本がよさげ。例えば、取得したデータ量が多すぎて画像描画が遅くなった時対応、などのTipsも豊富そうです。400ページ弱。
Professional iPhone and iPad Database Application Programming (Wrox Professional Guides)Professional iPhone and iPad Database Application Programming (Wrox Professional Guides)
(2010/10/26)
Patrick Alessi

Objective-Cの文法は分かっている人向けの本です。大きく3パート構成で、パート1ではデータを使ったアプリの作成方法、パート2ではCoreDataの使い方、パート3ではWebサービスとの連携をやるようです。ちょっと古いのでARCなどには対応しておらず、そこはこっちで補完して読む必要があります。

Chapter 1:Introducing data-driven applications
第1章では、単純なアプリを作ります。XcodeやMVC(Model-View-Controller)の説明の後に開発開始。NSStringのNSArrayを持つModelクラス(NSObjectの子クラス)を作成し、それを使ってUITableViewを描画します。UITableViewDelegateの話をしておしまい。意外とHello World的なこともやるんだな。

Chapter 2:The iPhone and iPad database: SQLite
第2章では、オープンソースライブラリSQLiteを使います。SQLiteは、アプリ組み込み型のリレーショナルデータベース管理システムです。データを1つのファイルに保存し、それにSQL文でアクセスしますので、軽量なデータであればMySQLなどより使い勝手がよいです。sqlite3 hogehoge.dbコマンド1つでデータベースを作れて、あとは普通にクエリを実行できるのですね。GUIもあるし、敷居は低そう。

データベースへの接続は専用クラスを作ります。.dbファイルをアプリ内に入れておいて、それにアクセスします。クエリの実行は、プリペアードステートメントを作成し、その結果をstepで一行ずつ読み込むことで行います。プリペアードステートメントで引数的に扱う部分は?にしておいて実行時に変更することができます。データの読み出し関数はsqlite3_column_textなど色々種類があります。一覧が本にもありますが本家を見てみてもいいかも。

//DBAccess.m
sprite3 *database;

- (void)initializeDB
{
 NSString *path = [[NSBundle mainBundle] pathForResource:@"database" ofType:@"db"];
 if (sqlite3_open([path UTF8String], &database) == SQLITE_OK) {
 } else {
  sqlite3_close(database);
  //エラー処理
 }
}

- (NSMutableArray *)someQuery
{
 NSMutableArray *ret = [[NSMutableArray alloc] init];
 const char *sql = "SELECT hogehoge....";
 sqlite3_stmt *statement;
 //プリペアードステートメント
 int sqlResult = sqlite3_prepare_v2(database, sql, -1, &statement, NULL);
 if (sqlResult == SQLITE_OK) {
  while (sqlite3_step(statement) == SQLITE_ROW) {
   //statementからデータを取り出して、Modelクラスに格納
   //ModelクラスをretにaddObject
  }
  sqlite3_finalize(statement); //リソースのrelease
 }
 return ret;
}

結構単純でいいですね。使ってみよう。

Chapter 3: Displaying your data: the UITableView
第3章では、UITableViewについて掘り下げます。UITableViewおよび関連クラスは、DBから取得したデータを一覧で表示するのによく使うのでよいですね。

まずUITableViewをカスタマイズしていきます。subviewなどを持たせてリッチなtableにしていきます。途中でdequeueの説明などが入りますが、恥ずかしながらよく分かっていなかったので学習できてよかったです。Stringで指定するIdentifierはcellのstyleを指定してcellを再利用しているものなのですね。普通のscrollviewとは違いますね。

複数のsubviewをCellに持たせると、パフォーマンスに影響が出ます。これに対応する方法としてdrawRect:をオーバーライドする方法を説明しています。なお、カスタムにdrawRectする場合セル内のアニメーションは非推奨なので、ユーザが編集できるCellにはこの方法は使えません。また、一度にdrawRectしたものは同一とみなされるため、その中に複数のボタンを含めることはできません。他にパフォーマンスを上げる方法として、Cellが透過しないようにする(opaque = YES)のは基本みたいですね。opaqueがNOになっているものはInstrumentsのCoreAnimation、Color Blended Layersで確認できます。

//ViewCell.m
- (void)drawRect:(CGRect)rect
{
 //文字列
 [string drawAtPoint:CGPointMake(0,0)
  forWIdth:120
  withFont:[UIFont systemFontOfSize:18]
  minFontSize:12
  actualFontSize:NULL
  lineBreakModel:UILineBreakModeTailTruncation
  baselineAdjustment:UIBaselineAdjustmentAlignBaselines];

 //画像
 [image drawInRect:CGRectMake(0,0,0,0)];
}

Indexについても説明があります。アドレス帳の右のアルファベットのようなもの。ここって開発者が決めれるんですね、へー。更にsearch barを付ける方法も詳細に書いています。

Chapter 4: iPad interface elements
第4章では、iPadに視点を移します。前半はUISplitViewControllerとUIPopoverControllerを説明しながらサンプルアプリを作っていきます。目新しいところはなし。UIPopoverControllerを使ったことなかったので、ViewControllerを引数に渡してinitするのが新鮮でした。

中盤はGesture Recognizerの話。対応するUIGestureRecognizerの子クラスをviewにaddしてあげることで、swipeやpinch動作を簡単に認識してくれるクラスです。以前ゲームを作ったときはこれがなくて一つ一つ書くのが面倒だった……。しかしこれiPadの章にあるべきなのか?

//ViewController
- (void)viewDidLoad
{
 [super viewDidLoad];
 UISwipeGestureRecognizer *swipeLeft = [UISwipeGestureRecognizer alloc] initWithTarget:self action:@selector(swipeToLeft:)];
 swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
 [self.view addGestureRecognizer:swipeLeft];
}

- (void)swipeToLeft:(UIGestureRecognizer *)sender
{
}

最後にiTunesを介したPCとのファイルシェアリングの話。plistでApplication supports iTunnes file sharingを設定した後、アプリの中でデータをXML化させて保存させています。個人的にあまり興味がないので読み飛ばし。


長くなってきたので一旦ここで切ります。ちょうどPart1の終わりだし。次はとうとうCoreDataに入るようです。

PageTop

MPFlipViewControllerの使い方

ゲームばっかり作っていて、UIKitを使ったアプリを作っていないことに思い至ったので学習中です。基本は下記をざっと読んで理解。遷移周りをもう少し詳しく書いてあるとよかったですが、読みやすいしイメージはつきました。

iPhoneプログラミングUIKit詳解リファレンスiPhoneプログラミングUIKit詳解リファレンス
(2010/01/12)
所 友太
iPhone/iPad/iPod touch プログラミングバイブル iOS 6/Xcode 4対応 (smart phone programming bible)iPhone/iPad/iPod touch プログラミングバイブル iOS 6/Xcode 4対応 (smart phone programming bible)
(2012/10/22)
布留川英一

んで本題。

その中でFlipBoardみたいな動きをするライブラリMPFlipViewControllerを使って遊ぼうとしたのですが、使い方がよくわからなかったので概略をメモります。

動作イメージと導入
コードと動作イメージはgithub。Modified BSD Licenseです。
cocoapodsを使う場合は

pod `MPFlipViewController`, `= 0.0.2`


概略
親UIViewControllerの下で子UIViewControllerを動かす形になります。上述の動作イメージで言うと、遷移する部分(MATRIXの写真と説明文のあたり)が子UIViewControllerにあたります。

親UIViewControllerは、MPFlipViewControllerDelegateとMPFlipViewControllerDataSourceの2つのプロトコルを導入します(もちろん他クラスに導入しても良いですが)。単純に使うなら、プロトコルで定義されている関数はほぼsampleのままでよいです。一点、flipViewController: viewControllerBeforeViewControllerとflipViewController: viewControllerAfterViewControllerの、nilを返す条件のみ修正する必要があります。ここは、ページめくりができない条件(一番前にきている・一番後ろにきている)においてnilを返すようにしてあげればOKです。

子の方は普通のUIViewControllerです。これがFlipされるたびに作成され、描画されます。サンプルではcontentViewWithIndexメソッドで子UIViewControllerを作成しています。

よって、flipしたときのnil条件とcontentViewWithIndexメソッドを変えてあげれば、単純に自分のアプリに導入出来ます。たとえば、InterfaceBuilderで作ったTestViewControllerを無限にflipできるようにする場合は、以下の様なコードになります。

#pragma mark - MPFlipViewControllerDataSource protocol
- (UIViewController *)flipViewController:(MPFlipViewController *)flipViewController viewControllerBeforeViewController:(UIViewController *)viewController
{
 int index = self.previousIndex;
 index--;
 self.tentativeIndex = index;
 return [self contentViewWithIndex:index];
}

- (UIViewController *)flipViewController:(MPFlipViewController *)flipViewController viewControllerAfterViewController:(UIViewController *)viewController
{
 int index = self.previousIndex;
 index++;
 self.tentativeIndex = index;
 return [self contentViewWithIndex:index];
}

- (UIViewController *)contentViewWithIndex:(int)index
{
 TestViewController *page = [[TestViewController alloc] initWithNibName:@"TestViewController" bundle:nil];
 [self addChildViewController:page];
 [page didMoveToParentViewController:self];
 page.view.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
 return page;
}


ページ数を事前に指定しないでいいのもいいですね。DB連携などもしやすそう。

ちなみに下記の本でも紹介されています。この本はライブラリがいっぱい見れて便利。

iOSオープンソースライブラリ徹底活用iOSオープンソースライブラリ徹底活用
(2012/12)
菊田 剛

商品詳細を見る

PageTop
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。