タグ

ブックマーク / blog.fenrir-inc.com (49)

  • パキッとした描画

    iOS では座標を浮動小数点型(CGFloat)で指定します。アンチエイリアスのかかった美しい表示のために必要な機構ですが、くっきりとした(パキッとした)描画を行うには少しコツがいります。 例えば、CGContext を使って (100, 100) から (200, 100) へ太さ1ピクセルの黒100%のラインを引く際、そのままコードにすると次のようになります。 CGContextRef ctx = UIGraphicsGetCurrentContext(); CGFloat x, y; [[UIColor blackColor] set]; CGContextSetLineWidth(ctx, 1.0); x = 100; y = 100; CGContextMoveToPoint(ctx, x, y); CGContextAddLineToPoint(ctx, x + 100, y)

    パキッとした描画
  • ありがとう alloc-init

    Objective-C では、オブジェクトの生成に alloc と init などのイニシャライザを組み合わせて使うというのは、ちょっとでもかじったことがある方はご存じでしょう。 MyObject *obj = [[MyObject alloc] init]; 今日はこの仕組みについてです。まず、この alloc-init について2つのポイントを挙げておきます。 呼出し側はイニシャライザの戻り値を使うことになっている イニシャライザはクラスのインスタンスメソッドとしてプログラマが追加/オーバーライドできる Objective-C ではこのことが言語の基として存在しているおかげで、オブジェクト生成の柔軟性がぐっと上がっています。イニシャライザはプログラマが実装するので、どのようなインスタンスを返すかは自由です。上記の例で言えば MyObject の init は、MyObject そのも

    ありがとう alloc-init
  • UITextField でのバリデーションのタイミング

    アプリによってはユーザーの入力値をバリデーションする必要がある場合があります。今回はバリデーションを行うタイミングについて書きたいと思います。 今回は以下のようなアカウント情報入力画面を考えてみます。 UITextField が画面に表示されている NavigationBar には「保存」ボタンが設置されている 入力値が「カラ」もしくは「空白文字」以外の場合を正常な入力とする UITextField への入力値が不正な値の場合には「保存」ボタンを無効化する UITextField のデリゲートでは不十分? UISearchBarDelegate には以下のような入力後に呼ばれるデリゲートメソッドがあります。 - (void)searchBar:(UISearchBar *)searchBar textDidChange:(NSString *)searchText しかし、UITextFi

    UITextField でのバリデーションのタイミング
  • Settings.bundle でデバッグ向け設定を追加する

    Settings.bundle を作成 特定のビルド設定で Settings.bundle を削除するようなビルドスクリプトを追加 ビルド設定にユーザー定義変数を定義 適宜、UserDefaults の任意の値を参照するようなコードを追記 方法 こちらのドキュメントを参考に Settings.bundle を作成 ビルドスクリプトを追加 Xcode のメニューバーから ”Project” > ”New Build Phase” > ”New Run Script Build Phase” をクリック 出てきたウインドウに以下のようなスクリプトを記入 if [ "${DELETE_SETTINGS_BUNDLE}" == 1 ]; then rm -Rf "${TARGET_BUILD_DIR}/${FULL_PRODUCT_NAME}/Settings.bundle" fi ユーザー定義変

    Settings.bundle でデバッグ向け設定を追加する
  • 表示言語をプログラム側で制御する

    通常は端末設定の言語で表示言語が決まっていきますが、アプリ内の文言を端末設定とは違う言語で表示したいというシチュエーションもあるかと思います。今回は、その表示言語をアプリ内から切り替える方法をご紹介します。 端末設定に従う場合 通常通り Localizable.strings ファイルを作成します。ここでは例として日語と英語の二種類を作ってみます。 Localizable.strings (jp) /* comment */ "hello" = "こんにちは"; Localizable.strings (en) /* comment */ "hello" = "hello"; この Localizable.strings ファイルを使うためには、通常 NSString *str = @"hello"; としていたところを NSString *str = NSLocalizedString

    表示言語をプログラム側で制御する
  • カテゴリを活用する

    Objective-C では「カテゴリ」という仕組みを使って既存のクラスに新しいメソッドを付け加えることができます。自分で作ったクラスでもシステムが提供しているものでも付け加えることができますのでカテゴリを活用した例を紹介します。 アプリを開発しているとアプリ内で使用する色がいくつか決まってきます。これらの色を各 View などに対して直接記述することもできますが、複数の場所で同じ色を設定したい場合には処理が分散してしまい後で変更が必要になったときに都合が悪くなります。そこでカテゴリの登場です。 @interface UIColor (SGUIColorAdditions) + (UIColor *)sg_tintColor; + (UIColor *)sg_detailTextColor; + (UIColor *)sg_detailViewBackgroundColor; @end @

    カテゴリを活用する
  • iOS 標準の連絡先情報をアプリから利用する

    今週リリースした FlickAddress (App Store) は、iPhone 標準の連絡先情報をグループ管理できるようになっています。すでに iPhone に登録されている連絡先情報はそのまま FlickAddress でも扱えますし、FlickAddress で情報やグループを編集すれば、標準の連絡先アプリにも反映されます。 このように標準の連絡先データベースを利用するための API が iOS に標準で搭載されている AddressBook フレームワークです。さらに、連絡先の表示・編集等の UI を表示するための AddressBook UI フレームワークも用意されています。 今回は FlickAddress のリリースを記念して、これら 2 つのフレームワークの概要を紹介しましょう。 Address Book フレームワーク Address Book フレームワークは、i

    iOS 標準の連絡先情報をアプリから利用する
  • 知っていると便利な UIView の contentMode

    UIView には contentMode というプロパティがあります。このプロパティを使えば、面倒な画像の編集をせずに見た目を変えられます。 contentMode は View のサイズが変わる時にコンテンツをどう表示するかを決めるものです。たいてい画像をどう表示するかを決めるので、UImageView や UIButton で使われます。enum で色々定義されているので、下の画像を使って順に試していきます。 UIViewContentModeScaleToFill View のサイズと画像のサイズが同じになります。View の横幅が画像より大きいので横に伸びてしまいます。UIImage を stretchableImage にした時などに使います。 UIViewContentModeScaleAspectFit アスペクト比を維持したまま、画像のすべてが表示されるようにリサイズされ

    知っていると便利な UIView の contentMode
  • iOS で XML をパースする

    iOS で使える XML パーサーは色々あります。 iOS 標準で使えるものは以下の2点 Cocoa Touch フレームワークで提供されている NSXMLParser C言語のライブラリである libxml2 を直接利用 外部のライブラリでは主に以下のようなものがあります。 GDataXML KissXML TBXML XML パーサーの中でも SAX と呼ばれる少し扱いにくいが比較的高速で省メモリなもの。DOM と呼ばれる扱いやすいがメモリを多く消費しやすいものがあります。 今回は Cocoa Touch フレームワークで提供されている NSXMLParser の使い方を紹介します。 NSXMLParser は SAX タイプのパーサーで C言語のライブラリである libxml2 をラップしたクラスになります。XML パースのおおまかな流れは、インスタンスを初期化 → デリゲートを設定

    iOS で XML をパースする
  • MapKit の地図に自作のピンを表示する

    携帯端末の強みの一つとして、GPS 機能があります。その位置情報の活用方法としては様々なものがありますが、代表的なものは地図表示ではないでしょうか。iOS の MapKit にはデフォルトで位置を表示するピンが用意されていますが、最近自作のピンを設定する機会があったので、その方法について書きたいと思います。 MapKit のざっくりとした使い方 MapKit を使うにあたってのざっくりとした流れは MapKit.framework を追加 MapKit/MapKit.h を import MKMapView を作成し、MKMapViewDelegate で制御 となります。 MKMapView およびそのサブクラスという意味で、以下マップビューと呼ぶことにします。同様に、MKAnnotationView およびそのサブクラスという意味でアノテーションビューと呼ぶことにします。 マップビュー

    MapKit の地図に自作のピンを表示する
  • UIView を簡単に拡大・縮小・回転させる transform プロパティ

    UIView には、transform というプロパティがあります。このプロパティを使うと簡単に UIView を拡大・縮小・回転させることができます。transform プロバティの型は CGAffineTransform です。transform の中身は 3×3 の行列で、 z 軸の回転行列として扱うことができます。初期値は、単位行列になっています。 拡大・縮小について まずは拡大・縮小から説明します。 sampleView.transform = CGAffineTransformMakeScale(2, 2); このように書くと元のサイズの2倍と大きさになります。 また、以下のように書くと現在設定しているサイズの2倍になります。 sampleView.transform = CGAffineTransformScale(sampleView.transform, 2, 2); こ

    UIView を簡単に拡大・縮小・回転させる transform プロパティ
  • Xcode 4 でデフォルトになった LLVM って何?

    こんにちは。開発担当の金内です。 Xcode 4 は UI もすっかり変わりましたが、ビルドの要であるコンパイラもデフォルトが変更されています。その新しいコンパイラのキーワードが「LLVM」です。いまいち聞き慣れない方もいると思うので、今回はその LLVM について簡単にご紹介します。 ざっくりとした結論から言ってしまえば、Xcode における LLVM は従来のデフォルトコンパイラである GCC を置き換えるものです。LLVM には次のような特徴があります。 ・コンパイルが速い ・コンパイルされたコードが速い ・エラーメッセージがわかりやすい ・他のツールと連携しやすい いいことばかりですね。 しかし、コンパイラは要となる重要なコンポーネントなので、互換性などへの配慮から、Apple は GCC からの移行を少しずつ段階的に進めています。 実際、Xcode 4.0 でのデフォルトは完全に

    Xcode 4 でデフォルトになった LLVM って何?
  • iPhone と Android で同じアプリを作るときの UI 設計ポイント

    こんにちは。共同開発部企画担当の荻野と申します。 フェンリルでは自社のソフトウェアを開発する部署とは別に、他の企業や団体と共同でアプリケーションの開発をおこなう共同開発部という部署が存在します。 私はその中で企画提案の担当をしていますが、最近、「今ある iPhone アプリケーションを Android でも出したい」「iPhoneAndroid 同時開発してほしい」とのご相談をクライアント様よりいただく事が増えてきました。 「同じスマートフォン同士、親戚みたいなものなんだから簡単に平行展開できるでしょ?」と、軽いノリでご相談をもってきてくれるパートナー企業様。 いやいや、ちょっと待ってください。 iPhoneAndroid では、端末のも UI も全然違うので、そんな簡単にできるものではないのです。 そもそも OS が異なるので、 iOS では簡単にできるけど Android

    iPhone と Android で同じアプリを作るときの UI 設計ポイント
  • NSView と UIView

    こんにちは、iOS/Mac アプリ開発担当の宮です。 最近は、Sleipnir Mobile for iPhone と Sleipnir for Mac を開発しています。 Sleipnir for Mac の開発では、UIKit と AppKit の違いに苦戦しています。 出てくるクラス名も接頭辞が違うだけのものが多いので、ほとんど変わらないと思っていたのですが、ふたを開けてみると全くの別物でした。 今回は、その中でベースのビューとなるクラス NSView と UIView の違いについて紹介します。 これから Mac アプリを開発する方は参考にしてみてください。 ■ NSView には見た目に関するプロパティが全然ない NSView のクラスリファレンスを見るとビックリするぐらい UIView にあるプロパティがありません。最初、backgroundColor がないのには驚きました

    NSView と UIView
  • 【 iOS 開発 Tips】View のレイアウトをどうするか?

    こんにちは、共同開発部 iOS アプリ開発担当の図子です。 iOS 開発をしている皆さんはどういったタイミングで View のレイアウトをおこなっていますか?私は1年くらい前までは ViewController の viewWillAppar 等のメソッド内や、ViewController から View へ情報をセットするタイミングで ViewController 側から直接 View の frame やその View が持つ UILabel の frame を触っていたりしていました。これだと、想定外のタイミングでレイアウトが崩れたり、ViewController 側のコード量がふくれあがってしまいがちであまり良くないと思います。また、autoresizingMask を使うと楽ですが少し込み入ったレイアウトが必要になってくると autoresizingMask では対応できなくなって

    【 iOS 開発 Tips】View のレイアウトをどうするか?
  • Objective-C のルーツ! Smalltalk で純粋オブジェクト指向環境を体験しよう

    こんにちは。オブジェクト指向な開発担当、金内です。 名著「達人プログラマー」では年に1つは新しいプログラミング言語を覚えることが推奨されています。たしかに新しい言語に触れると、慣れ親しんだ言語で凝り固まったアタマによい刺激になります。 嬉しいことに、世の中には既に数えきれないほどのプログラミング言語があり、新しい言語もどんどんどんどん生まれているので、「もう学ぶべき言語がないっす」ということは起こりませんね。 みなさんは「次に学ぶ言語」としてどんな言語に興味を持っているでしょうか? 今回は「次に学ぶ言語」としてもぴったりな Smalltalk をご紹介します。Smalltalk は、数あるプログラミング言語の中でも純粋なオブジェクト指向プログラミング環境の手として高く評価されていて、最近では iPhone / iPad アプリの開発に欠かせない Objective-C のルーツとしても脚

    Objective-C のルーツ! Smalltalk で純粋オブジェクト指向環境を体験しよう
  • 【 iOS 開発 Tips】あなたも気付いていないかもしれないメモリリークの恐怖

    こんにちは、共同開発部 iOS アプリ開発担当の図子です。 iOS 開発をしている皆さんはメモリリークのチェックを行っていると思います。どのような方法で確認していますか?おそらく以下のような方法で行っていると思います。 ・Static Analyzer を使う ・Instruments の Leaks テンプレート でも、これだけでは見つからないメモリリークが起こりうることをご存じでしょうか? addSubview: で何枚もの View を貼っていないか? 実際にメモリリークと呼べるかどうかは微妙かも知れませんが、開発者の意図しない不要なメモリがドンドン確保される可能性があるのでここではメモリリークと書かせていただきます。 非常に気付きにくいメモリリークとは view に addSubview: する際に起こりやすいのです。 以下のコードを見てください。ある UIViewControll

    【 iOS 開発 Tips】あなたも気付いていないかもしれないメモリリークの恐怖
  • xcode Blocks を使ってコールバック

    こんにちは! 共同開発部で日々コードと戯れております、福井です。 iOS 4.0 から追加された関数オブジェクト的なものである Blocks をご存知でしょうか。この Blocks のおかげで UIView のアニメーションは劇的に書きやすくなりました。もう当に Blocks って素晴らしいですね。 アニメーション? 違う!違うよ!根的に違うよ! Blocks でやりたいのはアニメーションじゃないよ! おれは Blocks でコールバックを書きたいんだ! ということでさっそく書いてみました。 今回は MyPickerView という UIPickerView をちょっと拡張したものを作ってみます。 MyPickerView の要件はこちら ・下から出てきたり引っ込んだりする ・出てくると画面がちょっと暗くなる ・終了ボタンと完了ボタンがある ・コールバックの Blocks を受け取って

    xcode Blocks を使ってコールバック
  • より豊かな表現のために、3つのステップで実装する Core Text

    こんにちは、開発担当の眞弓です。 テキストを表示するとき、通常は UILabel などを使いますがときどき「凝った文字列を使いたい」ということはないでしょうか? そんなときのために、今回は Core Text の基的な使い方について書いてみようと思います。 人によってやり方は違うと思いますが、ちょっとしたことに使う場合に私がやっててわかりやすかった方法を紹介します。 位置を指定するやりかたはイメージしにくいので、文字列単位で扱えるやり方で実装をしてみました。 以下のような感じで、「属性付き文字列を作って、その文字列を付け足していって、最後にまとめて表示」というやり方です。 1 : 文字列を作成 2 : フレームを作成 3 : DrawRect 1 : 文字列を作成 属性付き文字列は以下のような感じで作っていきます。 atrString = [[NSMutableAttributedStr

    より豊かな表現のために、3つのステップで実装する Core Text
  • iPhone / iPad アプリのアニメーションをなめらかにするためのポイント3つ

    こんにちは。開発担当の金内です。 みなさん、Sleipnir Mobile for iPhone / iPad を使っていただけているでしょうか? 今日は Sleipnir Mobile の特徴となっている「TouchPaging」を開発したときの経験から、iPhone / iPad アプリ開発でスムーズなアニメーションを実現するためのコツをご紹介します。 タブをスワイプ操作で切り替える TouchPaging は、開発中のある段階で機能としては実現できたものの、スワイプ中のアニメーションがどうにもこうにもガクガクしていて、心地よいとは言えないものでした。はじめのうちは iPad のパフォーマンスの限界かと思っていたのですが、「いや、こんなハズじゃない」という意見が開発チームで持ち上がり、改善に向けた取り組みがはじまりました。 パフォーマンス問題なら Instruments の出番です。

    iPhone / iPad アプリのアニメーションをなめらかにするためのポイント3つ