45
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

最速ではてなブログリーダー・アプリを作る!

Last updated at Posted at 2014-01-18

この内容は始めたばかりの個人ブログに掲載したのですが、さすがにまだ何も反応がないのでQiitaにも掲載しておくことにしました。

概要

はてなブログには人気エントリーを返すRSSフィードがあるので人気エントリーを表示するアプリを勉強がてらに作ってみました。
Core Data に取得した人気エントリーを保存してるのでオフラインでもみれます。
(ただこのアプリ、表示できるのは人気エントリーの一覧だけです・・・)

Xcode5から使いやすくなったAuto LayoutやXCTestなどあまりキャッチアップできていなかった部分の勉強や単体テストをちゃんと書くという目的があったのですが、作りっぱなしでは面白くないのでソースコードも公開しています。

スクリーンショット

・ブログ一覧画面(縦)
blogScreenshot1.png

・ブログ詳細画面(縦)
blogScreenshot2.png

・ブログ一覧画面(横)
blogScreenshot3.png

・ブログ詳細画面(横)
blogScreenshot4.png

開発後の感想

Auto Layoutは正直かなりよかったです!
これまでUILabelの高さを可変にする表示はNSString:sizeWithFont:constrainedToSize:lineBreakMode:を使って毎回計算してました。
Auto Layoutの使う場合、制約の設定さえちゃんとしておけばUILabelの高さ調整は勝手にやってくれます。
(もっと早く知っておきたかった・・・)
勝手にやってくれるんで sizeToFitなどのメソッドをプログラムから呼び出さないようにしましょう。
ただ一つ問題として横画面にも対応させたのですが、縦から横画面へした際にStoryBoardから設定した制約だけではUILabelの横幅の制御がどうもうまくいきません。
仕方なくUILabel.preferredMaxLayoutWidthを横画面のサイズに併せて変更かけることで対応しています。

- (void)updateLabelPreferredMaxLayoutWidthToCurrentWidth:(UILabel *)label
{
    label.preferredMaxLayoutWidth = [label alignmentRectForFrame:label.frame].size.width;
}

- (void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    
    // 横画面にした際にラベルの横幅が縦画面のサイズのままになってしまうため、
    // preferredMaxLayoutWidthを画面サイズに併せて調整する
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.bodyLabel];
    [self updateLabelPreferredMaxLayoutWidthToCurrentWidth:self.titleLabel];
    [self.view layoutSubviews];
}

その他にもCore Data用に初めて使ったMagicalRecordは思った以上に便利でした。
特にマルチスレッドでCore Dataを扱う部分をかなり楽にしてくれます。
MagicalRecordのドキュメントにあったサンプルを見てもらえば納得してもらえると思います。

Person *person = ...;
[MagicalRecord saveInBackgroundWithBlock:^(NSManagedObjectContext *localContext){

    Person *localPerson = [person MR_inContext:localContext];

    localPerson.firstName = @"John";
    localPerson.lastName = @"Appleseed";

} completion:^{

    self.everyoneInTheDepartment = [Person findAll];

}];

ブロック内に書いた処理を全て別スレッドで処理を行い、完了ブロックはメインスレッドで動作します。

あと単体テストはXCTestを使って最低限のモデルのテスト書いてます。
HTTP通信周りはOHHTTPStubs使ってやってます。

まとめ

細かい説明を書く余裕がないので興味がある方はGitHubからソースを落として試してみてください。

今回ははてな教科書を参考にしながら開発してみました。
とても充実した内容で初心者向けのようですが中級者以上の方でも参考になる部分はあると思います。

ご意見や改善点などありましたら是非お聞かせください!

45
43
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
45
43

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?