ぴよログ

↓に移転したのでこっちは更新されません、多分。

Objective-C

ボタン以外(UILabelとか)をタップしたいなら透明ボタンがいいかも

iOS開発でボタン以外の要素をタップさせたくなることがたまにあるかもしれない。例えばラベルとか画像とかね。 そういった場合によく取られる方法はもしかしたらtouchesBeganやtouchesEndedのイベントを使うことかもしれない。けれど、タッチ系のイベントで…

今更Objective-C、ブロックをプロパティにして呼び出すメモ

コールバック的に呼びたい処理をブロックプロパティにして使う方法。 ヘッダー typedef void (^Handler)(void); @interface MyViewController : UIViewController @property (nonatomic, copy) Handler handler; - (IBAction)buttonTapped:(id)sender; @end …

SwiftのUnderscore.js風ライブラリ見つけた

前にObjective-C向けのを見つけてこんなのを書いた。 Underscore.js風Objective-Cライブラリ「_.m」 - PILOG Swiftにも早速似たようなのが出てきたようだ。 Dollar.$wift by ankurp サンプルで比較 例としてfindのサンプルを。 Swift $.find([1, 2, 3, 4, 5,…

MPMoviePlayerViewControllerが再生完了時に勝手に閉じて困る

iOSには動画再生用にMPMovierPlayerViewControllerっていうクラスがあって、URLを渡して表示するだけでめちゃくちゃ簡単に動画再生機能を実装できる。すごく便利。 その分自由度が低くてちょっとした挙動を変えるのが大変だったりする。 まず、普通に動画を…

iOS7時代のステータスバー非表示方法

このあたりの処理はやり方がコロコロ変わるようなので検索しても情報が古くて困る。2014/06/07時点、Xcode5.1.1、iOS7.1 SDK時点での情報を書いておく。 正解はステータスバーを表示したくないViewControllerでprefersStatusBarHiddenをオーバーライドする。…

Obj-Cで非同期処理の完了を待ちたいならブロック渡してコールバックだよね

Swiftは出たけどまだまだObjective-Cはオワコンってことにはならないと思うからObjective-Cの話を。 Objective-Cで非同期処理をしてその結果を受けてなんかしたい、ってときが結構あるんだけど待ち方がいまいちよくわからなかったことがあった。今思えば基本…

SwiftからObjective-Cを呼ぶ方法。CocoaPodsも。

SwiftとObjective-Cは相互に呼び合えるらしい。Objective-CからSwiftはすでに記事があった。 SwiftのコードをObjective-Cから呼んでみた - Qiita もしSwiftからObjective-Cのコードを呼べるのであれば、大抵のCocoaPodsライブラリは使い回せることになるので…

UIViewのカテゴリでtouchesBeganなどを定義するとどうなるのか?

Objective-Cではカテゴリを使って既存のクラスに新しいメソッドを追加したかのように振る舞わせることができる。 では、カテゴリで新しいメソッドではなく、既存の(というかオーバーライドして使うようなもの)を定義するとどういう挙動になるのか。気にな…

カテゴリを使って既存クラスにプロパティを追加する

Objective-Cではカテゴリを使って既存のクラスを拡張してメソッドを追加することができるが、メソッドだけでなくプロパティを追加することもできる。 例えばこんな風にUIViewのカテゴリを新規作成し、ヘッダーにプロパティを定義する。今回はNSStringにした…

Objective-Cで非同期処理のテスト(依存ライブラリなし版)

Xcode標準のテストライブラリがうまいことやってくれないせいで、非同期処理のテストを書く場合に待ちの処理を自分で書いてあげないといけません。 最近のすごくいい感じの拡張が紹介されたのでこれを使うとなかなかいい感じです。 Objective-Cで非同期処理…

Underscore.js風Objective-Cライブラリ「_.m」

マニアックなライブラリを見つけたのでメモっておきます! _.m Home Underscore.js風のインターフェースを提供するObjective-Cのライブラリです。前書いたこれに少しだけ近い。 ActiveRecordのようなselectやwhereをObjective-Cで使う - PILOG 今回紹介する_…

Objective-CでBuilderパターン

Builderパターンてのは、生成が面倒なオブジェクトの生成をいい感じにするデザインパターンです。Objective-Cではブロックを使っていい感じにできるみたいですね。 例えば特定日時のNSDateを生成するには次のようなコードを書くことになります。そこそこ煩雑…

ctagsをObjective-Cに対応させる

ソースコードにタグ付けするctagsはObjective-Cに対応していませんが、設定ファイルにパターンを書くことである程度対応させることができるようです。 設定ファイル~/.ctagsに以下を貼り付けます。 # ~/.ctags --langdef=objc --langmap=objc:.m.h --regex-o…

__bridgeキャスト

C++をある程度知っているというものあってObjective-Cの言語的なところはほぼスキップしてiOSの開発をしているという側面が僕にはあります。 で、Xcodeの警告でたまに出てくる__bridgeキャストってなんじゃいなと思いながらもIDEに任せて直してもらっていた…

LinqToObjectiveCの実装を覗く

LinqToObjectiveCの中身を覗く Objective-CのNSArrayやNSDictionaryでwhereやselectなんかを使えるようにするカテゴリがあるという話をしました。 ActiveRecordのようなselectやwhereをObjective-Cで使う - PILOG 記事を書いたあと中身を覗いてみたのですが…

ActiveRecordのようなselectやwhereをObjective-Cで使う

RailsのActiveRecordやC#のLINQではデータ列に対して選択や絞り込みなどを行う際、SelectやWhereなどを用いて要素を絞りこんだり要素のプロパティの集合を取り出したりすることができます。言い換えるとある集合に対する操作の結果として別の集合(または値…

調整が面倒すぎるのでUIViewのframe用のカテゴリを導入

こういうスライドとか やはりお前らのiOS7対応は間違っている さらには解説記事とか やはりお前らのiOS7対応は間違っている(解説編) - Qiita 読んでもやっぱりうまくいかなくてコードで調整しちゃうときあるよね。 でもCGRectの更新って本質的にめんどくさい…

Objective-Cでの正規表現によるマッチ文字列取り出し

Objective-Cのmwaterfall/MWFeedParserというRSSフィード解析ライブラリを使っていて不便だったことに、本文中の画像URLを得る方法がないというものがありました。幸いHTMLタグ付きの本文を持っていたのでその中からimgタグをもってきてやろうということでイ…

Objective-Cでの自前のイベントっぽい仕組み

非同期でネットワークからデータを取ってくる系の処理が終わったときにUITableViewのreloadDataを呼びたいみたいなとき。どうやってやるのがいいんでしょうか? delegate observerパターン KVO ReactiveCocoa 自前でなんか作ったやつ iOSでよくあるのはdeleg…

NSLogデバッグのときに便利なCGRect→NSStringの変換

NSLogデバッグの良し悪しは置いておくとして、CGRectとかNSDictionaryとかの値をちょっと確認するのにNSLog使ったりしますよね。CGRectの値を確認するときに一生懸命NSLog("%f", rect.size.width)みたいにやってたりマクロ書いたりしていたんですが、もっと…

Objective-Cでenumを定義する

使う機会が少なくていつも忘れてしまうし、どの書き方がいいのかよくわからなかったのでメモしとく! MMDrawerControllerのサンプル見ててみつけました。こんな感じで書けるみたい↓↓ typedef NS_ENUM(NSInteger, MMDrawerAnimationType){ MMDrawerAnimationT…

Objective-CでBlockを遅延実行するコード

performSelectorもいいんだけど、メソッドを定義するのが面倒ってことありますよね。そういうときはブロックを遅延実行させれば良いです。 次のコードをカテゴリとして追加してあげて、 こんなふうに使います。 - (void)hoge { [self performBlock:^(){ // d…

入れ子になったNSDictionaryのデータを取り出す

何重にも入れ子になったNSDictionaryのデータをチマチマ取り出すのは超絶めんどくさいです。valueForKeyで取り出したNSDictionaryにさらにvalueForKeyして、さらに、、なんてやるともうやってられません。 幸いvalueForKeyPathというメソッドで少し簡単にで…

iOSで日時の相対表記

1 week agoみたいな日付の相対表記をiOSでやりたいので探しました。そしたらCocoaPods対応のライブラリがありました。 kevinlawler/NSDate-TimeAgo これです。カテゴリでNSDateを拡張してくれてあります。 インストール 普通のCocoaPods。 # in Podfile pod …

ISO8601拡張表記のNSStringをNSDateに変換する

iOSアプリで日付文字列をNSDateに変換する話です。よく知られているように、NSDateFormatterを使って変換をするのが一般的です。 NSDateFormatter* formatter = [NSDateFormatter new]; formatter.dateFormat = @"yyyy/MM/dd HH:mm:ss"; NSDate* date = [for…

NSCopyingって何?

先日書いた「ペア要素をキーにしたNSDictionary」という記事でNSDictionaryのキーにしたPairクラスはNSCopyingプロトコルを実装するように書きました。 このNSCopyingに関してはこれまで詳しいことを知らなかったのでヘッダーやリファレンスで調べてみました…

ペア要素をキーにしたNSDictionary

NSDictionaryで複数要素をキーにしようというお話です。 普通の連想配列はキーとバリューで1つの組み合わせになりますが、片方が◯でもう片方が☆のときはこの値みたいなケースの場合は最初から用意されているデータ型では間に合わないことが多いです。 C++で…

AVFoundationを使ったカメラ機能はちゃんとメモリを開放しましょう

こちらを参考にAVFoundationを使ったカメラを実装したのですが、このやり方だとどうもメモリを圧迫するということがわかりました。 iOSのカメラ機能を使う方法まとめ【13日目】 | Developers.IO カメラ機能を使うビューに移動→戻る、を繰り返すとだんだんと…