サクサク読めて、アプリ限定の機能も多数!
トップへ戻る
衆院選
obc-fight.blogspot.com
乱数生成によく使う関数でarc4random()があります。この関数はrand()で行う初期化作業が必要ないので重宝されています。 しかし欠点もあり、以下がそうです。 実はarc4random()はランダム性に少しバイアスが掛かっています。arc4random()は0から2^32-1の値を返すため、それの法をとる際に微妙にランダム性が崩れるのです(modulo bias:0から10の値をとるランダム値のモジュロ7の法をとると、0-3の出現割合は4-6の二倍になりますね)。ただし、MAX_NUMが2の累乗であれば完全にランダムとなります。 Objective-Cの乱数作成はarc4random_uniform - だいたい47度 これを補ってくれるのが arc4random_uniform() です。 arc4random_uniform()の使い方使い方はarc4random()と似ていま
バッジを削除する方法をメモします。この"バッジ"というのは、Push Notificationなんかで受信したりするとアプリのアイコンの右上に付く数字のことです。 バッジを削除するバッジを削除する前に、 まず、バッジを付ける場合は以下のように行います。 [UIApplication sharedApplication].applicationIconBadgeNumber = 1;数字を変化させたい場合は変数で管理してください。 バッジを削除するには、上で書いた[UIApplication sharedApplication].applicationBadgeNumberに負の数を設定します。 [UIApplication sharedApplication].applicationIconBadgeNumber = -1;簡単ですね! また、この処理を実行する箇所はAppDelegate
エラー「clang: error: no such file or directory: '.../AppName/AppName-Prefix.pch'」について プロジェクト名変更後に以下のエラーが出たのでメモ。 clang: error: no such file or directory: '.../AppName/AppName-Prefix.pch' 原因今回はPrefix.pchファイルがディレクトリにないために起こったエラーでした。 対処方法プロジェクト -> TARGETS -> Build settings へ移動し、「Apple LLVM compiler 4.2 - Language」項目の"Prefix Header"を適切なパスに直すことで解決しました。 [追記:2013/03/30] info.plistがない場合も上記のような方法で対処できます。 info.
キーチェーンアクセスから古い証明書を削除し新しい証明書を適用しようとしたところ以下のエラーがでました。 "システムルート" キーチェーンは変更できません。 ルート証明書の信頼設定を変更するには、キーチェーンアクセスで証明書を開き、“信頼設定”で変更します。新しいルート証明書は現在のユーザのログインキーチェーンに追加されます。このマシンのすべてのユーザによって証明書が共有される場合は、システムキーチェーンに追加されます。 今回はそのエラーの対処方法を書きます。 エラーが出る前にやったこと今回のエラーが出る前に行ったことを詳しく書きます。 キーチェーンアクセスから古い証明書を削除 新しい証明書をダブルクリック キーチェーンアクセスが自動起動 => 上記エラーがでた ※ この"証明書"というのは「ファイル名.cer」となっているもの。Apple Developerからは「aps_developm
UIButtonクラスのaddTarget:action:forControlEvents:メソッドは実行時に引数を渡せないので有名(?)です。 他のメソッドであればNSInvocationクラスを使って@selectorに引数を渡す事はできるのですが、addTarget:action:forControlEvents:メソッドでは不可能のようです (こちら参照)。 今回はそのaddTarget:action:forControlEvents:メソッドに引数を渡す方法をメモで。かなり力技でやっとります(笑) 今回は以下のような形で呼び出す場合の例です。 //ボタンが押されたときの処理 [(UIButton*)btn addTarget:self action:@selector(btnDidPush:) forControlEvents:UIControlEventTouchUpInsid
UINavigationControllerで前のビューに戻る方法をメモで書きます。 遷移の方法ビューの遷移は以下のコードで行ったものとして説明します。 HogeViewController *vc = [[HogeViewController alloc] init]; [self.navigationController pushViewController:vc animated:YES]; ビューを戻してみるでは、ビューを戻してみます。 1つ前に戻る一つ前に戻るのであれば以下のコードを使用します。 [self.navigationController popViewControllerAnimated:YES];pushされたものをpopしている感じですね。 2つ以上前に戻る2つ以上前に戻るのであれば、まず、UINavigationControllerで遷移してきた過去のビューは
UIImageをフォトライブラリに保存する方法をメモで。 UIImageを保存する画像の保存はUIImageWriteToSavedPhotosAlbumメソッドを使用します。 以下、簡単な例です。 例//保存したい画像 UIImage *_saveImage = [UIImage imageNamed:@"image.png"]; //画像を保存する -(void)saveImage { UIImageWriteToSavedPhotosAlbum(_saveImage, self, @selector(savingImageIsFinished:didFinishSavingWithError:contextInfo:), nil); } // 完了を知らせる - (void) savingImageIsFinished:(UIImage *)_image didFinishSavin
Xcodeで独自のカスタムURLスキームを設定する方法をメモ。 環境Xcode : 4.6.2 iOS SDK : 6.1 デバッグ 実機 : iPod touch、バージョン6.1.3 URLスキームを設定する独自URLスキームを使用するにはXcode側でいくつか作業する必要があります。 Xcodeでの設定まず「TARGETS」->「info」->「URL Types」を選択します。 「URL Types」で以下のようにURLスキームを設定します。 "Identifier"、"URL Schemes"について「iOSアプリケーションプログラミングガイド」から解説を抜粋します。 IdentifierURLスキームの抽象名を含む文字列。一意性を確保するため、com.acme.myschemeのように、逆DNS形式の識別子を指定することをお勧めします。ここで指定した文字列は、アプリケーションの
今回はBlock構文(Block Literal Syntax)についてです。最近はデリゲートよりBlockが推奨されてきているので調べてメモしようと思います。 Blockの基本構文Blockの基本的な使い方をまとめていきます。 宣言、代入、実行// 宣言 void (^blocksTest1)(void); // 代入 blocksTest1 = ^(void) { NSLog(@"blocksTest1"); }; // 実行 blocksTest1(); 宣言は、戻り値(^関数名)(引数) と宣言します。引数voidは()に省略可能です。 代入は、関数名の後ろにイコール(=)を入れ、^(引数){} のように行います。 実行は、関数名() のようにして呼びます。 宣言、代入を同時に行う// 宣言, 代入 void (^blocksTest2)(void) = ^(void) { NSL
※ 両ソフトともダウンロードは無料でできます。使用するための"プロダクトキー"を無料で取得できるの間違いでした。 iPhoneやAndroidなどのモバイル向けのゲームがとても流行っていますが、開発の高速化に非常に役に立つツールに「TexturePacker」と「PhysicsEditor」というものがあります。前者は複数の画像ファイルからテクスチャアトラスを生成できるもので、後者は物理エンジン用のシェイプを作成できるものです。 これら2つのツールが通常であれば有償なのですが、今だとブロガーやフレームワークの開発者は無料でダウンロードできるようです。 やったね!
タッチイベントに関して少し調べたのでメモで。今回はタッチしたところに画像を移動させた際の覚え書きです。 タッチイベントに関しては以下に簡単にまとめられています。 Objective-C講習/タッチイベントについて - 福井高専IT研究会OfficialWiki 開発環境、プロジェクト開発環境は、Xcode4.3.3、エミュレータはiPhone iOS5.1です。プロジェクトは「Single View Application」を選択。 移動させてみるViewController.h #import @interface ViewController : UIViewController{ UIImageView *_iv; } @end ViewController.m - (void)viewDidLoad { [super viewDidLoad]; // 画像の生成 UIImage *
今回はUITableViewクラスについて疑問に思うことを書いてみようと思います。 主な疑問UITableViewクラスを使う際に毎回、カスタムセルを使ったほうがいいのかなとずっと悩んでいました。 結論カスタムセルについて色々しらべて以下の記事にたどり着きました。 UITableViewについて | ios-practice/docs/tableview.rst - GitHub 先に結論を書いてしまうのですが、 カスタムセルはなるべく使うようにする ということ。 なぜかというと上の参考記事からその理由を抜粋すると(少し長いですが)、 最初の表示更新メソッドが利用しにくくなることや dequeueReusableCellWithIdentifier: によるセルのキャッシュも利用しくくなるため、 UITableViewCellのサブクラス(いわゆるカスタムセル)を作り、Cellの拡張したV
エラー「A valid provisioning profile for this executable was not found」 リリース前の確認としてReleaseビルドを実行したところ以下のエラーが出ました。 A valid provisioning profile for this executable was not found 原因Provisioning Profileの不一致が起こったため。 エラーが出る前に行ったことSchemeメニューから「Edit Scheme」を選択。右メニュー「Run アプリ名」を選択し、「Info」メニューの"Build Configuration"の項目を"Debug"から"Release"に変更。そしてビルド。 対処方法AdHoc用 Provisioning Profileをインストールする。 「Apple Developer - Mem
CALayerをビューに追加したときの順番に関して調べたのでメモ。 CALayerの重なる順番はaddSublayer:メソッドでビューに追加した順にどんどん重なっていく仕様のようです。もちろんメソッドの順番でも関係してきます。 その重なりの順番を変更したい場合は「insertSublayer:」メソッドを使用すれば良いようです。以下検証。 レイヤーの順番をいろいろ検証検証1//レイヤー1 CALayer *layer = [CALayer layer]; layer.frame = CGRectMake(30, 50, 200, 200); layer.backgroundColor = [UIColor redColor].CGColor; [self.view.layer addSublayer:layer]; //レイヤー2 CALayer *layer2 = [CALayer l
cocos2dに含まれている物理エンジンBox2Dについてです。Box2D自体はじめて触るものですので、雰囲気など掴むために色々と調べながら書きました。 今回はXcodeからBox2Dのプロジェクトを作成しそのテンプレートを見てみます(以下の画像参考)。 はじめにはじめに基本的な概念を。ここは参考記事から抜粋させていただきます。 オブジェクトのアニメーションシステム。スプライトを剛体という物理オブジェクトに結びつけ同期する。 ボディには動的と静的がある。 静的ボディ同士は互いに衝突しないが、動的ボディは他の動的・静的ボディと衝突する。 動的ボディのパラメータ。密度(質量)、摩擦、反発 ボディは範囲を決定する1つ以上の図形(シェイプ)で構成される。 シェイプは円、四角形、多角形、頂点、直線。 衝突ごとに交差するポイント接触点が生成される。 ボディはジョイントによってつなぎ合わせることができる
UIView、UILabel、UIActivityIndicatorViewで「読み込み中」を表示してみる インジケーターをくるくるさせて、何らかの処理中であることを知らせるためのビューを作った際のメモ。 こういったライブラリは以下のようなものが既にあります。 MBProgressHUD - GitHub SVProgressHUD - GitHub 実際はライブラリを使ったほうが良いと思いますが、今回はちょっとやってみたくなったので。 完成図 開発環境、プロジェクト開発環境は、Xcode4.3.3、エミュレータはiPhone iOS5.1です。プロジェクトは「Single View Application」を選択。 ソースコードViewの角を丸くするのには「QuartzCore.framework」を使用します。プロジェクトへの追加をお忘れなく。 ViewController.h #im
現在のネットワークの接続状況が3G、WiFi、もしくは圏外なのかを確認する際に便利なのが「Reachability」というライブラリです。 このライブラリはApple公式のものになります。 サンプルコードをダウンロード、クラスの追加はじめに以下のページからサンプルコードをダウンロードしプロジェクトにReachability.h/mを追加してください。 Reachability - iOS Developer Library SystemConfiguration.frameworkの追加プロジェクトに「SystemConfiguration.framework」を追加します。 例以下使い方の例です。 #import "Reachability.h" Reachability *curReach = [Reachability reachabilityForInternetConnectio
ポインタについて個人的にまとめてみます。 ポインタとはほかの変数やメモリ領域のアドレスを示す変数のことで、間接的にデータにアクセスするためのものです。 ポインタの宣言ポインタの宣言方法は変数名の前に *(アスタリスク)をつけて宣言します。 int *a; or int* a; ※ Objective-Cではインスタンス変数もポインタの宣言方法と同じく変数名の前に *(アスタリスク)をつけます。 ポインタのサイズポインタのサイズは、32ビットOSなら4バイト、64バイトOSなら8バイトになります。 ポインタ変数の初期化ほかの変数のアドレスを知るにはint *a = &b; 変数aにbのアドレスが代入されます。 ポインタが示すアドレスの中身を得るにはint c = *a; int型cにint型aの指すアドレスの中身が入ります。 ポインタと文字列C言語の文字列はいわば配列で、1文字を表すchar
Core Animationを色々と弄っていたのでその個人的なメモ。 Core AnimationとはCore Animationはアニメーション処理をサポートするフレームワークです。もう少し細かい説明をApple Developerの資料から抜粋します。 CoreAnimationは、グラフィック描画、投影、アニメーション化のためのObjective-Cクラスのコレクションです。Core Animationは、Application KitとCocoa Touchのビューアーキテクチャを使用するデベロッパにとっては親しみのある階層レイヤの抽象化を維持しながら、高度な合成効果を用いた流体アニメーションを可能にします。 引用 : Core Animationプログラミング言語 - Apple Developer 基本的なCore AnimationはQuartzCoreフレームワークに含まれ
端末の画面サイズを取得する方法をメモ。 画面サイズの取得//画面取得 UIScreen *sc = [UIScreen mainScreen]; //ステータスバー込みのサイズ CGRect rect = sc.bounds; NSLog(@"%.1f, %.1f", rect.size.width, rect.size.height); //ステータスバーを除いたサイズ rect = sc.applicationFrame; NSLog(@"%.1f, %.1f", rect.size.width, rect.size.height); /*実行結果*/ /* //4inch 320.0, 568.0 320.0, 548.0 //3.5inch 320.0, 480.0 320.0, 460.0 */ boundsプロパティはステータスバーを含めたサイズ、applicationFram
UIViewのプロパティである「frame」と「bounds」の違いについてのメモ。 はじめこの二つは位置やサイズに用いるもので、簡単にまとめると、 frame はスーパービュー(親要素)から見た座標 bounds はローカルビュー(自身)から見た座標 となります。以下のアップル公式の資料に掲載されているイメージを見ると分かりやすいです。 引用:iOS Viewプログラミングガイド 確かめる二つのビューを生成して確かめてみます。 例 //viewAの生成 UIView *viewA = [[UIView alloc] init]; viewA.frame = CGRectMake(20, 20, 200, 300); viewA.backgroundColor = [UIColor redColor]; //背景を赤 [self.view addSubview:viewA]; //view
iOS6から追加されたUICollectionViewを弄ってみたのでそのメモ。 このUICollectionViewは、コンテンツを表示する土台を作って、セクションの数を決めて、セクション毎のセルの数を決めて、セルを返す、というように「UITableView」に似ています。 公式のリファレンスは以下になります。 UICollectionView Class Reference - Apple Developer とりあえず動くサンプルとりあえず動くサンプルです。 ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController <UICollectionViewDelegate, UICollectionViewDataSource> { UICollectionViewFlowLa
iOS6から追加されたUIRefreshControlを試してみたのでそのメモ。 このクラスは、もう最近はおなじみになった、ビューを下にグイッと引っ張り離すとビューが更新されるアレです。「プルダウンリフレッシュ」なんて呼ばれたりしています。 公式のリファレンスは以下になります。 UIRefreshControl Class Reference - Apple Developer サンプルコードとりあえず動くサンプルです。 このUIRefreshControlはUIScrollViewにUIRefreshControlのインスタンスを持たせることで機能します。スクロールビューを持っていればいいのでUITableViewでもUIWebViewでも実装できます。 ViewController.h #import <UIKit/UIKit.h> @interface ViewController
高速列挙でエラー「Collection was mutated while being enumerated.」が出た 高速列挙を使い配列から特定の文字列を削除しようとしたら「Collection was mutated while being enumerated.」というエラーが出たのでメモで。 エラーの対処このエラーは「列挙子を使ってアクセスしているときは配列の中身は変更しないでね」というエラーのようで、はじめは以下のような書き方をしていました。 修正前NSMutableArray *marr = [[NSMutableArray alloc] initWithObjects: @"aaa", @"bbb", @"ccc", nil]; NSString *str= @"bbb"; for (id obj in marr) { if ([str isEqualToString:obj
UITabBarControllerの下に挿入する方法をメモで書きます。 雰囲気としては以下の「2chまとめサイトビューア - MT2 FREE」みたいなものです。 2chまとめサイトビューア - MT2 FREE 2.7(無料) カテゴリ: ニュース, ブック 販売元: Trysail Inc. - Trysail Inc.(サイズ: 2.5 MB) やることは単純で、プロジェクト作成の際にタブバーを使ったアプリを作りたい場合はおそらく「Tabbed Application」を選ぶと思いますが、それを選ばず「Single View Application」か「Empty Application」を選んでコードでタブバーを生成してやるだけです。 ではやっていきましょう。 開発環境は、Xcode4.3.3、エミュレータはiPhone iOS5.1です。 プロジェクトの作成プロジェクトは上で説
アプリを起動しているデバイスの機種判定の方法について。iPhone5が発売されてデバイスの解像度の種類も増えたのでメモしておきます。 機種判定デバイスの機種を判定する方法はいくらかあると思いますが、調べるとsysctlbyname関数を使った方法が一般的のようです。機種判定の方法は、今回はカテゴリ機能を持ったUIDeviceクラスを実装して取得する方法で行います。 機種判定をするクラスの作成 インターフェース・実装ファイルUIDevice+HogeHoge.h #import <UIKit/UIKit.h> @interface UIDevice (HogeHoge) - (NSString *) platformName; @end UIDevice+HogeHoge.h #import "UIDevice+HogeHoge.h" #include <sys/sysctl.h> @imp
iOSでSQLiteを容易に利用できるようにするライブラリ「FMDB」の基本的な使い方をメモで。 FMDBを利用する準備 FMDBを用いたSQLiteの基本的な操作 FMDBを利用する準備ライブラリ「libsqlite3.0.dylib」の追加まずは、SQLite用ライブラリ「libsqlite3.0.dylib」をプロジェクトに追加します。 FMDBをダウンロード&プロジェクトに追加FMDBのソースコードをダウンロード、解凍 解凍したフォルダ内の「src」フォルダの中にあるfmdb.m以外のクラス(参照1)をプロジェクトに追加(参照2) ビルドしてエラーが出ないことを確認 参照1 FMDatabase.h/m、FMDatabaseAdditions.h/m、FMDatabasePool.h/m、FMDatabaseQueue.h/m、FMResultSet.h/m 参照2 FMDBを用い
OSのバージョンの取得と振り分けについてのメモ。 OSのバージョンは以下のコードで取得できます。 [[UIDevice currentDevice] systemVersion]; [UIDevice currentDevice]でUIDeviceクラスのインスタンスを取得し、systemVersionプロパティでOSのバージョンを取得しています。 バージョン毎に処理を振り分けfloat osVersion = [[[UIDevice currentDevice] systemVersion] floatValue]; if(osVersion >= 6.0f) { //iOS6以降 NSLog(@"iOS%f", osVersion); } else if (osVersion < 6.0f && osVersion >= 5.0f) { //iOS5.x.x NSLog(@"iOS%f
#importと@classの使い方について調べたのでメモ。 Objective-Cを触っていると頻繁に目にするこの#importと@class。 どちらも別ファイルで定義されているインスタンス変数なんかを使用する場合に、コンパイルを通すために用いるディレクティブですが、主な違いは以下のようにな感じになります。 #import 例:#import "クラス名.h" ヘッダファイルをまるごと読み込む。実装ファイル側で再度読み込む必要がない。C言語の#includeと違い、一度読み込んだファイルは再度読み込むことがない。 @class 例:@class クラス名; 「これはクラス名だよ」と宣言するだけ。実際に読み込みは行われない。「#import」と違い、実装ファイル側でヘッダーファイルを読み込む必要がある。 ということで、上記のリストと以下の参考記事からこの2つの使い方を以下にまとめます(早
次のページ
このページを最初にブックマークしてみませんか?
『Objective-Cと戦うブログ』の新着エントリーを見る
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く