読者です 読者をやめる 読者になる 読者になる

Bitbucket の iOS クライアントは CodeBucket で決まり

Bitbucket の iOS クライアント『CodeBucket』がいつの間にか無料になっていた。 codebucket.dillonbuchanan.com Bitbucket の iOS クライアントといえば、自分でもイシューに特化した『Bitissues』を作って使っていたけど、無料と知って即 CodeBucket に乗…

Bitissues を Swift で実装し直した

春に RubyMotion で実装し直した Bitbucket のイシュー専用クライアント『Bitissues』だけど、 今度は Swift で実装し直した。 BitissuesTakashi Nakamura仕事効率化無料 1 つのアプリを Objective-C、RubyMotion、Swift と 3 つの言語で実装したことになる…

DTCoreText で NSAttributedString を高速に描画

先日、HTML 文字列を NSAttributedString に変換する方法を書いた。 HTML を NSAttributedString に変換する - present NSAttributedString を UILabel の attributedText にセットするだけで、 お手軽に HTML を表示できるけど、UILabel は描画が非常に遅い…

HTML を NSAttributedString に変換する

HTML の文字列は let html = "<h1><a href=\"http://tnakamura.hatenablog.com\">Title</a></h1>" + "<ul>" + "<li><strong>Item1</strong></li>" + "<li><i>Item2</i></li>" + "</ul>" let data = html.dataUsingEncoding( NSUTF8StringEncoding, allowLossyConversion: true) let attrStr = NSAttributedString(HTMLData: data…

AFNetworking と ReactiveCocoa を組み合わせる

ReactiveCocoa を導入したからには使い倒す方針でやっていて、 AFNetworking を使った Web API 呼び出しは、次のようにして RACSignal 化している。 let signal = RACSignal.createSignal({ (subscriber) -> RACDisposable! in let manager = AFHTTPRequestO…

Swift で ReactiveCocoa を使う

はじめに Swift で iOS アプリを実装し直すにあたって、 ただ Swift に翻訳するだけではつまらないので、 MVVM アーキテクチャで実装することに決めた。 View/ViewController と ViewModel のバインド、 イベントや非同期 API 呼び出しのインタフェースを統…

Swift で AFNetworking を使う

CocoaPods で AFNetworking をインストール Podfile に pod "AFNetworking" を追加して pod install 実行。 Bridging-Header で AFNetworking のヘッダーをインポート <プロジェクト名>-Bridging-Header.h に #import <AFNetworking/AFNetworking.h> #import <AFNetworking/UIImageView+AFNetworking.h> を追加。 画像の非同期ダウン</afnetworking/uiimageview+afnetworking.h></afnetworking/afnetworking.h>…

UITableView 編集時に挿入用の行を表示したい

UITableView 編集時のみ、挿入用の行を表示したい。こんなやつ。 アイコン自体は tableView:editingStyleForRowAtIndexPath で UITableViewCellEditingStyleInsert を返せば表示できる。 ただ、編集時のみ挿入用の行を表示するとなると、結構面倒だった。 以…

Bitissues を RubyMotion で書き直してリリース

Objective-C で作っていた Bitbucket Issues の iOS クライアント『Bitissues』を RubyMotion で書き直した。 Apple の審査もすんなり通過。 これが初めてリリースする RubyMotion 製アプリになる。 今回のリリースで、ようやくイシューのステータスを変更で…

UITableView のセパレーターの描画がおかしい

ios

まずはこれを見て欲しい。 UITableView のセパレーターがおかしなことになっている。 左端に隙間が開いているものもあれば、左端までぴったり線が描画されているものもある。 左端までぴったり線が描画されているものは、線も少し太い。 UITableView の sepa…

RubyMotion でリポジトリに含めたくない設定を外部ファイルに抜き出す

Web API の consumer_key と consumer_secret のような、 人に知られたくないキーは Git リポジトリに含めたくない。 そこでキーを git リポジトリ管理外の設定ファイルに抜き出すことにした。 設定ファイルを読み込んで RubyMotion でいい感じに扱うための …

MBProgressHUD を使ったローディング表示

iOS アプリがサーバーと通信している間ローディング表示を出すために、 MBProgressHUD を導入することにした。 jdg/MBProgressHUD MBProgressHUD の基本的な使い方。 まずサブビューに追加し、 self.hud = [[MBProgressHUD alloc] initWithView:self.view]; …

AFNetworking 2.x の AFHTTPRequestOperationManager でベーシック認証に対応する

ベーシック認証のユーザー名とパスワードは、AFHTTPRequestSerializer にセットすればいい。 AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:url]; manager.requestSerializer = [[AFHTTPRequestSeriali…

Objective-C コードで Auto Layout を設定するためのライブラリを書いた

Xcode 5 になって、InterfaceBuilder や Storyboard で Auto Layout を設定しやすくなったけど、 コードで Auto Layout 設定したいときが稀にある。 例えば自分の場合、継承して使いまわすことを前提に View や ViewController のベースクラスを作るときとか…

AutoLayout で UIImageView の幅を固定したのに横長の画像を表示すると幅が変わってしまう

AutoLayout で UIImageView の幅を 80 に固定 UIImageView の contentMode は UIViewContentModeScaleAspectFill このとき、縦よりも横の幅がかなり長い画像を表示すると、UIImageView の幅が変わってしまった。 調べたところ、縦横のアスペクト比が違う場合…

依存ファイルの自動解決に失敗したときは motion-require

RubyMotion は Smart File Dependencies 機能があるので、依存ファイルを自動で解決してくれる。 でも、たま~に解決できなくて定数未定義エラーに遭遇するときがある。 そんなときは Rakefile で files_dependencies を記述すればいいんだけど、 依存してい…

ADBannerView の delegate を Storyboard で設定しない方がいい?

審査でリジェクトを受けて発覚したんだけど、 Storyboard で ViewController に ADBannerView を配置 Storyboard で ViewController を ADBannerView の delegate に設定 ViewController に ADBannerViewDelegate のメソッドを実装 ADBannerViewDelegate の…

AutoLayout を使って ADBannerView を配置する方法

ADBannerView は広告取得に失敗したら隠さないと、レビューでリジェクトされてしまう。 今までは広告取得に失敗したら frame を操作して画面外に移動していた。そのためのモジュールを Objective-C で書いたりもした。でも最近は AutoLayout を使うようにし…

Teacup の AutoLayout サポートを使ってカスタム UITableViewCell をレイアウトする

RubyMotion 用 gem の Teacup は、CSS っぽくビューのデザインを記述できる、 厳密にはビューのプロパティを設定するための内部 DSL。 なんと AutoLayout もサポートしていたりする。 rubymotion/teacup Teacup の AutoLayout を使って、カスタム UITableVie…

CoreDataQuery と NSFetchedResultsController を組み合わせる

CoreData でデータをフェッチするときは NSFetchedResultsController を使いたいけど、 CoreDataQuery には NSFetchedResultsController を取得するメソッドが無い。 その代わり NSFetchRequest は取得できるから、 CDQQuery っていう CoreDataQuery 内部で…

CoreDataQuery は気に入らなくても ruby-xcdm は使ったほうがいい

RubyMotion 用の CoreData ラッパー gem である CoreDataQuery を先日から使い始めた。当初は理想の gem に出会ったと思っていたが、使っているうちに気に入らない箇所がちらほら。 自分は Named Scope が使いたいので多少の不満には目を瞑っている。でも人…

Objective-C で YAML を扱うなら YAML-Framework が手軽

mirek/YAML.framework CocoaPods でインストールできる LibYAML のラッパーで、Objective-C っぽい API を提供している。 YAML のパースはこんな感じ。 NSString *yamlText = @"- title: 第一章\n" " articles:\n" " - title: 第一話\n" " path: Story1\n" "…

Objective-C での日付操作が苦行過ぎるので NSDate-Escort を導入した

Objective-C の日付操作では NSDate だけじゃなく NSDateComponents や NSCalendar が登場してきて、 その面倒くささはもはや苦行。 そもそも、簡単に年や月を取得できない NSDate の API がイケてない。 日付操作をもっと手軽にやりたい。 もう自分でライブ…

CoreDataQuery は求めていた gem かもしれない

CoreDataQuery という CoreData ラッパー gem が公開された CoreDataQuery - CDQ | InfiniteRed 開発元は RubyMotionQuery と同じ InfiniteRed。 RubyMotion ではラッパー gem じゃなくて、MagicalRecord や NLCoreData のような Objective-C のライブラリを…

自作ライブラリを CocoaPods でインストールできるようにした

ADBannerView を画面下に配置するオレオレライブラリ TNAAdController を使うとき、 ファイルをプロジェクトに追加して使っていた。 これだとソースコードが分散してしまって、コピペと変わらない。 よろしくないので、CocoaPods でインストールできるように…

UITableView の下に ADBannerView を配置するだけのライブラリ書いた

UITableView の下に ADBannerView を置くのは、無料+広告アプリでは定番レイアウト。 自分が作る iOS アプリでも採用している。 以前、 っていう記事を書いたけど、この方法はもう使っていない。 UITableView のフッターを設定しているので、表示データが 0 …

Objective-C のカテゴリでプロパティを定義する方法のメモ

objc/runtime.h で定義されている、objc_getAssociatedObject メソッドと objc_setAssociatedObject を使う。 #import <UIKit/UIKit.h> @interface UIViewController (SideMenu) @property (nonatomic, readonly) UIBarButtonItem *menuButtonItem; @end #import "UIViewCon</uikit/uikit.h>…

RubyMotion で MagicalRecord を使う

最近、RubyMotion 向けのラッパー gem じゃなくて、 Objective-C のライブラリを使ったほうがいいのでは、って思うようになってきた。 CoreData なら MotionData や MotionDataWrapper じゃなくて MagicalRecord。 そこで RubyMotion で MagicalRecord が使…

RubyMotion で CoreData を使うとき Xcode で作成した Data Model をラッパー gem なしで読み込む

先日 RubyMotion で CoreData を使うために試した MotionDataWrapper、 ソースコードを見たらシンプルな実装で難しいことやっていなかった。 Xcode の Data Modeler で作成したエンティティ定義を読み込むけど、 それは CoreData.framework が提供している機…

UITableViewCell の imageView をタップしたとき処理を行う方法

UITapGestureRecognizer を使う。 ついでに、タップされた位置からセルの indexPath も取得してみる。 // タップされた位置からセルの indexPath を取得 - (void)imageViewTouched:(UITapGestureRecognizer*)sender { CGPoint point = [sender locationInVie…

FontAwesomeKit の使い勝手が良かったので移行した話

FontAwesome-iOS、motion-fontawesome を経て、 今は FontAwesomeKit を使っている。 PrideChung/FontAwesomeKit FontAwesomeKit は開発が活発なので、最新の FontAwesome 4.0.3 に対応している。 しかも FontAwesomeKit という名前なのに、FontAwesome 以外…

MotionDataWrapper を使ったモデルのスペックを書く

CoreData を使ったモデルのスペックを書く場合、NSManagedObjectContext などのセットアップと、 テストデータの後始末が面倒。 このうちセットアップは MotionDataWrapper が楽にしてくれる。 あとは後始末だけど、こいつも MotionDataWrapper の spec にお…

MotionDataWrapper と NSFetchedResultsController を組み合わせる

MotionDataWrapper を使うと、CoreData を ActiveRecord ライクに扱えるため、 # すべてのエントリを配列で取得 all_entries = Entry.all # 下書きのみを配列で取得 draft_entries = Entry.where("draft = ?", true).all という風に、簡単にデータを取得でき…

RubyMotion で FontAwesome を使う

自分はデザインが苦手、特にアイコンが作れないので、 FontAwesome を重用している。 これがないとアプリ開発できないと言ってもいいくらい。 当然、RubyMotion でも使いたい。 前に Objective-C で FontAwesome を使ったときと同じ方法 を採用してもいいけ…

MotionDataWrapper で多対多のリレーションシップを実現する

MotionDataWrapper を使って、ブログのエントリとカテゴリみたいな、 多対多のリレーションシップに挑戦した。 すんなりいくだろうと思っていたけど、意外に嵌ってしまったので、 メモを残しておく。 エンティティとリレーションシップの定義 Xcode Data Mod…

RubyMotion のデバッガが LLDB になっていた

気づいたら、RubyMotion のデバッガが GDB から LLDB に変わっていた。 どうやら、iOS 7 から LLDB しか SDK に含まれないようになったためらしい。 @t_nakamura iOS 7 から LLDB しか SDK に含まれないようになったので、それに併せて GDB から LLDB に切り…

Formotion の Date row と Subform row で嵌った

Grouped スタイルの UITableView を使ったフォームを簡単に作成できる、 RubyMotion 用の gem 『Formotion』が便利。 clayallsopp/formotion 文字列入力や数値入力やスイッチなど、たいていの入力は README 読めば使える。 ただ自分の場合、日付選択とサブフ…

MotionDataWrapper

はじめに 「RubyMotion で CoreData を使うなら MotionData を導入した方がいい」って勧めておいてなんだけど、 その後『MotionDataWrapper』を知って速攻で移行してしまった。 macfanatic/motion_data_wrapper MotionDataWrapper の特徴 MotionData は Data…

RubyMotion で CoreData を使うなら MotionData を導入した方がいい

RubyMotion で CoreData が使えることは確認できた。 * ただ、CoreData のエンティティ定義をコードで書くのは結構シンドイ。 NSManagedObjectContext の初期化や CRUD を含めると、CoreData だけでかなりのコードを書くことになる。 正直、CoreData のラッ…

RubyMotion で CoreData を使う

# -*- coding: utf-8 -*- $:.unshift("/Library/RubyMotion/lib") require 'motion/project/template/ios' begin require 'bundler' Bundler.require rescue LoadError end Motion::Project::App.setup do |app| app.name = 'CoreDataSample' app.frameworks…

Objective-C で流れるようなインタフェース

Underscore.js にインスパイアされた Objective-C のライブラリ Underscore.m を試してみたんだけど、 その使い方にちょっと驚いた。 流れるようなインタフェースで書けるじゃないか。 例えば、公式ページのサンプル。 NSDictionary *dictionary = @{ @"en":…

iAd を画面下に固定する方法

UITableView を画面いっぱいに表示し、広告を画面下に表示するというのは、 よくある組み合わせだと思う。 このとき、UITableView をスクロールしても、広告は画面下に固定して、ずっと表示していたい。 ただし、Apple の審査に通るために、広告の取得に失敗…

CoreData で複数の条件で絞り込む方法

NSPredicate を作成して NSFetchRequest に設定する。これが基本。 NSPredicate *predicate = [NSPredicate predicateWithFormat:@"price > %d", 1000]; [request setPredicate:predicate]; 値段と数量、といった複数の条件で絞り込みたい場合。 条件が固定…

iOS で FontAwesome を使う方法

はじめに Inkscape でツールバー用のアイコンを作成していたけど、 すべてのアイコンで通常用とRetina用の2種類作成する必要があってウンザリ。 アイコンが必要になるたび思う。 「FontAwesome みたいなアイコンフォントが使えれば」って。 FontAwesome+iOS …

SVProgressHUDでインジケーターを閉じるときの注意

SVProgressHUD は // インジケーター表示 [SVProgressHUD showWithStatus:@"Sending..."]; // 終了 [SVProgressHUD dismiss]; というコードで簡単にカッコいいインジケーターを表示できて重宝してる。 ただ、普段インジケーターを閉じるのに dismiss を使っ…

AFHTTPClient の getPath が送信するリクエストのクエリ文字列で試行錯誤した話

AFHTTPClient の getPath に [client getPath:@"user/tasks" parameters:@{ @"status": @[@"completed", @"new"] } success:^(AFHTTPRequestOperation *operation, id responseObject) { } failure:^(AFHTTPRequestOperation *operation, NSError *error) { …

Objective-C で動的にメソッドを追加する

Objective-C でも、Ruby みたいに動的にメソッドを追加することができた。 ということは、Objective-C でもメタプログラミングができるね。 今のところ、セレクタを引数に受け取るメソッドのテストで重宝している。 #import "MyTests.h" #import <objc/runtime.h> @implement</objc/runtime.h>…

ViewController でナビゲーションバーの戻るボタンがタップされたかどうか判定する方法

viewWillDisappear の中で、ナビゲーションコントローラーの管理下に自分自身が含まれているかチェックし、含まれていなければ戻るボタンがタップされたと判断できた。 - (void)viewWillDisappear:(BOOL)animated { if ([self.navigationController.viewCont…

OCMock を使って AFHTTPClient のサブクラスをテストする

例えば、AFHTTPClient を継承したカスタムクライアントがあるとする。 #import <Foundation/Foundation.h> #import <AFNetworking/AFHTTPClient.h> @interface TodoClient : AFHTTPClient - (void)getTodoList:(void(^)(NSArray*))success failure:(void(^)(NSError*))failure; @end #import "TodoClient.h" @implem</afnetworking/afhttpclient.h></foundation/foundation.h>…

AFNetworking でベーシック認証に対応する方法

久しぶりの Objective-C。 定番通信ライブラリ『AFNetworking』で、ベーシック認証が設定された Web API にアクセスする方法を README や Github の Wiki で調べてみた。 さっぱりわからない。 仕方ないので、ソースコード読んだり、StackOverflow 漁ったり…