[iOS] 簡単なドロップダウンメニューを実装してみた。

ナビゲーションバーの下から出てくる簡易的なメニューUIを作ってみました。

TopSlideMenuSample

ナビゲーションバー上の「Menu」ボタンをタップすると、メニュー画面が出てきます。メニュー上のボタンを押すとメインのView(青のView)上のテキストが変わります。
Single View Application テンプレートを元に作成しました。

MenuView

UIViewを継承した”MenuView”クラスを作成してメニュー画面を実現しました。
メニューのレイアウトは.xibファイルで定義し、ボタンを押した際の動きなどは実装ファイルに記述しています。

  • “MenuView”クラスの役割
    • メニュー画面の動きを実現する
    • メニュー開閉状態の保持する
    • どのボタンが押されたかをメインのViewControllerへ伝達する

例えば、メニューを開く時に呼ばれるメソッドは、以下のようになっていて(MenuView.m)、アニメーションさせながらViewの座標をずらしています。

また、メニュー内のボタンが押されたことをメインのViewControllerに伝達するためにDelegateを使っています。
MenuView.hファイル内で、以下のように”MenuViewDelegate”プロトコルを定義しています。

ViewController

Single View Application テンプレート作成時に生成されるViewControllerに少しだけ手を加えています。

  • “ViewController”クラスの役割
    • MenuViewインスタンスの作成して保持し、MenuViewインスタンスをself.Viewのサブビューに追加する
    • ナビゲーションバー上の「Menu」ボタンがタップされた時に、タップされたことをMenuViewへ伝達する
    • MenuView表示時に半透明グレーのViewを表示する
    • MenuViewDelegateプロトコルで定義したメソッドを実装し、そのメソッド内でラベルテキストの変更を行う

プロジェクトファイル

作成したプロジェクトファイルはGitHubで公開しています。

参考ページ

nmattissonさんのDropdownMenuというライブラリを参考に作成しました。

プロジェクト作成時にローカルリポジトリを作成し、GitHubのリポジトリにPushしました。今回、GitHubのリポジトリへのPushを初めて行ったのですが、以下のページを参考にしながら作業しました。

ちなみに、この記事とGitHubのReadmeに貼り付けているGifアニメはLICEcapというアプリで作成しました。

また、ソースコードのハイライトは”Crayon Syntax Highlighter”というプラグインを使用しています。

[Objective-C] 今さらですが、ARC超入門 (2)

前回の「今さらですが、ARC超入門 」(1) に引き続きiOSアプリ開発のネタです。

今後どういった形でコーディングしていくのかというルールを決めてみました。

hファイル

hファイルについてです。

(1)プロパティとpublicなメソッドのみ記載し、{}は使わないようにします。

(2)ARCがない頃は、@propertyの部分にassign/retain/copyパラメータを指定することで、メモリ管理の仕方をコンパイラに指示していました。ARCでは、weakとstrongパラメータを指定し、コンパイラに指示します。

(3)publicなメソッドはここに書きます。

mファイル

mファイルについてです。

(4)
@imprementation にインスタンス変数を書けるようになったので、外部との連携を必要としないインスタンス変数は@implementation部に記述します。

(5)セッター・ゲッターは@synthesizeで実装します。
インスタンス変数名は、プロパティ名の前にアンダースコアをつけたものにします。

参考ページ
Xcode ARC時代のマイルール

[Objective-C] 今さらですが、ARC超入門 (1)

今回はiOSアプリ開発ネタです。

iOS5で導入されてしばらくたってしまったARCですが、
今まで使ってきませんでした。

最近、ARCを使う機会があったので、
調べてみました。

ARCの基本

ARC (Automatic Reference Counting) とは、
「自動リファレンスカウンタ」のことです。

コンパイルの際に「retain」や「release」などのメソッドをコンパイラが挿入してくれるもので、書かなければならないコードが減るという便利なものです。

しかし、「一定のルール」に従う必要があります。

retain, release, autoreleaseは書かない

・retain, release, autoreleaseはコンパイラが挿入してくれるので、コンパイラに任せます。(自分で呼んではいけません)
・deallocもコンパイラに任せます。(直接deallocを呼び出していけません。deallocのオーバーライドは可能ですが、[super dealloc]は呼び出してはいけません)

メモリ管理の基本的な仕組みは、手動メモリ管理と同じです。

「retain, release, autorelease」を使う代わりに、
「強い参照」と「弱い参照」という概念を導入して、
コンパイラに自動挿入してもらいます。

強い参照と弱い参照

「強い参照」と「弱い参照」を使い分けてオブジェクトを利用します。

強参照 :
参照先のオブジェクトを自分で保持します。
強参照されているオブジェクトは常に利用可能で、
強参照されなくなったり、スコープ外に出た場合は破棄されます。

弱参照 :
参照先のオブジェクトを自分で保持しません。
参照先のオブジェクトが誰からも強参照されなくなったとき、自動的にnilが代入されます(Zeroing)

という考え方が基本になります。

あるオブジェクトを保持したい場合は強参照します。保持しない場合は弱参照します。
「循環参照」を避けるために、二種類の参照が存在します。

「 __strong」や「__weak」などの修飾子を使って「強い参照」と「弱い参照」のどちらなのかを示します

強い参照 : __strong
デフォルトは強い参照ですので、通常は指定する必要はありません。
alloc/initで生成されたオブジェクトは、現在のスコープ(多くの場合、変数が宣言された中括弧内)のライフタイムの間、維持されます。
nilで初期化されます。

弱い参照 : __weak
delegateパターンを使うときなどは、相互循環を防ぐために弱い参照を使います。
nilで初期化されます。
iOS4では使えません。

その他 :
__unsafe_unretaind :
__weekが使えないiOS4ではこれをつかいます。nil初期化やZeroingが行われません。

__autoreleasing :
手動メモリ管理の時にautoreleseメッセージを送信していたのと同様の働きになります。
nilで初期化されます。
強参照されているオブジェクトも、変数スコープ外に出れば破棄されるので、あえてこれを使うことは稀です。

その他

ARCで使えないものに以下のものがあります。

・NSAllocateObject, NSDeallocateObject
・C構造体の中でのオブジェクトポインタ
・NSAutoReleasePool (@autoreleasepoolブロックの使用は可能。)
・メモリゾーン
・“new”から始まるプロパティ名

その他に、CとObjective-C間のキャストには特定の方法を利用する必要があります。

まとめ

ARCを利用する際の基本的なルールを掴むことができました。
次回は、これらを踏まえて、どういった形でコーディングしていくのかというマイルールをまとめたいと思います。

参考ページ
[iOS5] ARC (Automatic Reference Counting) : Overview
Objective-C ARCによるメモリ管理

新たに5つ追加された、Apple公式日本語ドキュメント

By: bfishadow

Apple公式の、iOSアプリ開発関連のドキュメントの日本語訳が
新たに5つ追加されています。

Cocoa Auto Layoutガイド 

“Cocoa Auto Layout Guide の日本語訳です。Cocoa Auto Layoutは、UI部品のサイズや位置をルールを使って定義することにより、ローカライズやコンテナビューのサイズ変更によるレイアウトの乱れを吸収します。”

iOS Collection View プログラミングガイド 

“Collection View Programming Guide for iOS の日本語訳です。コレクションビューは、データ項目の順序つき集合を表示する手段のひとつで、レイアウトを柔軟に変更できる、という特徴があります。よくあるのは格子状に項目を配置する方法ですが、iOSのコレクションビューは、単に行と列の形に並べる以外にもさまざまな配置が可能です。”

ネットワーキング ト ピックス 

“Networking Programming Topics の日本語訳です。この資料は、特殊なネットワーク処理を実装する場合に読むべき記事を集めたものです。”

  • ソケットやソケットストリームの使い方
  • DNSによるホスト名の解決
  • TLSのチェーン認証を正しくオーバーライドする方法

ネットワーキング コンセプト 

“Networking Concepts の日本語訳です。iOSアプリケーションの開発に必要な、TCP/IPのネットワークモデルの基礎についての解説です。”

ネットワーキング オーバービュー

”Networking Overview” の日本語訳です。品質の高いネットワーク処理コードを記述する方法について説明します。
”Networking Overview の日本語訳です。品質の高いネットワーク処理コードを記述する方法について説明します。”

 

これら以外にも多数のドキュメントが公開されています

日本語ドキュメント – Apple Developer