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

hachinoBlog

hachinobuのエンジニアライフ

Objective-C

NSLayoutConstraintを使ってAutoLayoutをコードで書く

背景 AutoLayoutをxib上で使っているのだけれどxibでは表現できるAutoLayoutに限界があると思いコードで書く方法を調べたのでメモ。 サンプル 1.self.viewから左20,上20のマージンをとった位置にwidth100,height100の赤いViewを配置 UIView *redView = [[UIV…

iOS7とiOS8でUIScreenのboundsのサイズが違うので対応する

背景 iOS8からUIScreenのboundsを取得すると端末の向きに応じてwidthとheightの値が変更されるようになりLandscape対応でちょっと困ったのでメモ iOS7とiOS8で差分を埋める + (CGSize)mainScreenSize { CGSize screenSize = [UIScreen mainScreen].bounds.si…

重複件数まで取得できるNSCountedSet

背景 例えばこんな問題があったとする。 インプットした文字列の単語の重複件数を求めなさい。 例) banana 答) b: 1 a: 3 n: 2 この問題を何か効率的に処理できる方法はないかと考えたときにNSCountedSetを見つけたので使い方をメモ。 使い方 NSCountedSetは…

addSubviewやremoveFromSuperviewをトリガーにする方法

背景 addSubviewやremoveFromSuperviewしたタイミングでViewの処理をしたかったので色々調べてたら出てきたのでメモ。 方法 willMoveToSuperview:、didMoveToSuperviewメソッドを使用すれば良い。 willMoveToSuperview: 自身(UIView)が親Viewに追加される直…

CoreDataで集計関数を使う

背景 前回のNSExpressionを使って今度はCoreDataで集計関数を使用する方法を調べたのでメモ。 サンプル 下記のデータ構造とデータを格納しているSeminarsテーブルがあると仮定する。 Seminars date seminar charge 2014/05/01 SeminarA 1,000 2014/05/02 Sem…

配列内で集計関数(最大値、最小値、平均値、合計値など)を使用する方法

背景 配列内の値の合計や最大値などを取得したい場合に何か良い方法はないかと調べた。 方法 NSExpression を使用することで集計関数の式を定義できる。 //最大値 NSArray *numArray = @[@3, @6, @12, @8]; NSExpression *maxExpression = [NSExpression exp…

NSURLConnectionでオレオレ証明書(自己署名証明書)を許可する方法

背景 オレオレ証明書を使用している開発機にNSURLConnectionでhttps接続しようとしたら下記エラーが出力された。 NSURLConnection/CFURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9813) 解決方法 NSURLConnectionのデリゲートの - (void)conn…

CocoaPodsで[overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Pods.xcconfig'.]の対処方法

背景 CocoaPodsでライブラリをインストールしようとしてpod installコマンドを叩いた際に下記が出力されたので調べた。 [!] The target `MyProject [Debug]` overrides the `HEADER_SEARCH_PATHS` build setting defined in `Pods/Pods.xcconfig'. - Use the…

iOS7でステータスバーの領域が黒く塗りつぶされてしまう場合の対処方法

背景 iOS7でNavigationControllerのNavigationBarを使用しているにも関わらず下記のようにステータスバーが黒く塗りつぶされてしまい対応するのに時間を要してしまったのでメモ。 原因 この現象になる原因としてはiOS6以前でUINavigaitonBarに画像を下記のよ…

NSDateで取得したGMT時間のままNSStringに変換する方法

背景 NSDateのdateメソッドで時刻を取得すると日本時間とは9時間差のGMT時間が返されることは知っていたのだがNSDateFormatterで取得した時間をNSString型に変換したらGMT時間でなく現地時間に変換されてしまっていたので調べた。 現象 NSDate *now = [NSDat…

NSDictionaryの配列からNSPredicateを使って該当のNSDictionaryを抜き出す方法

背景 NSDictionaryの配列から該当のNSDictionaryを取得する際に今まではforループで1つ1つ判定して取得していたのだが速度が遅いのでNSPredicateを使って該当のNSDictionaryを取得する方法を調べた。 やり方 NSArrayのfilteredArrayUsingPredicateで取得し…

16進数のカラーコードをもとにUIColorを作成する

背景 カラーコードは大体16進数表記なのでiOSのUIcolorを作る際に16進数表記のカラーコードを10進数に変換してUIColorを作成したかったので調べた。 やり方 下記メソッドをUIColorのカテゴリに追加した。 + (UIColor *)colorWithHexString:(NSString *)hex {…

WebViewで表示しているHTMLのソースを表示する方法

背景 プログラム内で動的に生成したHTMLをWebViewで表示した際にデバッグ目的としてHTMLのソースを表示したくて調べた。 やり方 表示終わりのwebViewDidFinishLoad:メソッドあたりに下記コードを追加。 - (void)webViewDidFinishLoad:(UIWebView *)webView {…

WebViewでHTMLを読み込んだ際に画像が表示されない現象

背景 久しぶりにHTMLつくってWebViewで表示させたらHTML内で表示するはずの画像が表示されなかった。 問題のコード NSString* htmlFileName = @"sample.html"; NSString *filePath = [[NSBundle mainBundle] pathForResource:filename ofType:nil]; NSString…

UIImageのリサイズ

背景 画像の大きさをコードでリサイズしたかったのでUIImageのリサイズ方法を調べた。 やり方 //UIImageのリサイズメソッド - (UIImage *)resizeImage:(UIImage *)image rect:(CGRect)rect { UIGraphicsBeginImageContextWithOptions(rect.size, NO, 0.0); […

Xcode5.1で今まで使っていたプラグインが使えなくなってしまった場合の対処方法(暫定版)

背景 Xcodeを5.1にしたら便利なプラグインが使えなくなって発狂した。 解決方法 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins/[各プラグインフォルダ]/Contents/Info.plist を開いて DVTPlugInCompatibilityUUIDsキーの値に A2E4D43F-41F…

Xcode5.1でundefined symbols for architecture armv64 エラー

背景 iOS7.1のリリースに併せてXcodeのバージョンを5.1にアップデートし以前のXcodeで正常にビルドできていたプロジェクトをXcode5.1でビルドしてみたところ、あるコードの箇所で undefined symbols for architecture armv64 という見慣れた感じのArchitectu…

申請時に Creating a new Signiant Transfer Engine because the previous transfer had to be canceled. This session is at risk of running out of availble system resources.

背景 いつものように申請作業をしていたら、Validateの際に Creating a new Signiant Transfer Engine because the previous transfer had to be canceled. This session is at risk of running out of availble system resources. という警告が出た。 警告…

Xcode内の環境変数$(SRCROOT)を参照する方法

背景 Xcodeのビルドエラーで$(SRCROOT)などの環境変数が出てきて、それがどこの階層を示しているのか分からなくて困っていたのでやり方を調べた。 やり方 Xcodeの[TARGETS]-[プロジェクト名]-[Build Phase]タブを選択してTarget Dependenciesをクリック。 そ…

座標系操作とかのCGGeometryのメソッドについて色々調べてみた

背景 前回の記事で紹介したCGRectOffset関数を皮切りにCGGeometryって便利だなと思って簡単に調べてみました。 関数紹介 CGSizeEqualToSize bool CGSizeEqualToSize ( CGSize size1, CGSize size2 ); 指定した2サイズが等しいか判定する。 サンプル CGSize s…

座標をオフセット指定で操作できるCGRectOffset

経緯 下記のように赤いViewのスグ隣に青いViewを配置したいとする。 今まではCGRectGet系メソッドを使って下記のようにやっていた。 //赤いViewの配置 UIView *redView = [[UIView alloc] initWithFrame:CGRectMake(60.0f, 150.0f, 100.0f, 100.0f)]; redVie…

メインバンドル内に階層をつくる方法

経緯 プロジェクト内にフォルダを作成して、そのフォルダ内にある画像を読み込む際にプロジェクト内で作成したフォルダはコンパイラ上では ホーム/[アプリ名.app]フォルダ直下にリソースが展開されてしまう。 //[アプリ名.app]フォルダ直下にsampleの3つの画…

メソッドの遅延実行はperformSelectorでなくdispatch_afterを使う

経緯 メソッドの遅延実行に今までperformSelector: withObject: afterDelay: を使用していたのだが呼び出すメソッドの引数が複数ある場合に困っていた。 呼び出すメソッドの引数を配列で受け取るようにとかすれば良いのだろうけど、そのためだけに仕様を変更…

iOS7からSQLiteファイルがWALモードになっていてアプリが落ちる件

事象 iOSアプリでデータを差し替えるのに申請しないといけないのが面倒だったため、WEBシステムと連携させて新しいSQLiteをダウンロードしてアプリ内の既存SQLiteと差し替えて対応していた。 しかしiOS7の端末でSQLiteの差し替えを行うとクラッシュしてしま…

UIViewに枠線や枠の色および角丸を設定する方法

UIViewやUIButtonなどに枠線をつけたりする方法を忘れて毎回ぐぐっているのでメモ。 やり方 UIView *layerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)]; layerView.center = self.view.center; //枠線 layerView.layer.borderWidth = …

Objective-Cの定数の定義方法

ローカルな定数の定義 #define FIRST_NAME @"hachinobu" でなく static NSString * const kFirstName = @"hachinobu"; を使う。 理由は#defineでは型情報がないことと、誤って再定義されてしまう可能性がある。 グローバルな定数の定義 //ヘッダーファイル内…

iOS7でステータスバーとViewが重ならないようにする方法

iOS7でNavigationControllerを使用していない場合は、ステータスバーと描画しているViewが下記のように重なってしまう。 私が行った対処法はViewControllerのselfのViewの上にもう一つ同じ大きさのBaseとなるViewを配置し、そのBaseViewの上に表示したいView…

端末の向きの取得方法

縦画面、横画面に応じてレイアウトの変更などが必要な場合に端末の現在の向きを取得したい場合が多々ある。 そんな時には下記のように取得する。 UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation; viewWillAp…

UILabelを上寄せにする方法(簡易版)

UILabelを上寄せにしたい場合がある。 その場合、OHAttributedLabelやTTTAttributedLabelなど便利なライブラリがあるけど、ただ単に上寄せしたいだけならばUILabelの高さを適切なサイズに変更してあげれば上寄せになる。(上寄せというか高さを文字が入るぎり…

2013年振返りと2014年のエンジニアライフについて少し考えた

若干の出遅れ感を残しつつ去年の振り返りと今年のやるべき事を整理してみる。 〜2013年のエンジニアライフを振り返る〜 まず、去年を振り返るうえで重要だと思われるキーワードは下記3つ。 勉強会 GitHub 堤修一さん これらについて1つずつ振り返っていくこ…

iOS5でaddGestureRecognizerしたViewの上にUIButtonをaddSubViewした場合にボタンを押下してもEventが呼ばれない

題名の通りaddGestureRecognizerしたViewにUIButtonをaddSubviewした際、iOS5系ではUIButtonを押下してもEventが呼ばれずUITapGestureRecognizerにフックされてしまった。 問題が起きるコード #import "ViewController.h" #import "AppDelegate.h" @interfac…

plistから読み込んだデータを簡単にオブジェクトに変換する方法

plistからデータを読み込んでオブジェクト化する時はNSPropertyListSerialization propertyListWithData: options: format: error:を使うと便利。 例えばPerson.plistを作成したとする。 内容は下記のようになっている。 Person.plist コード - (void)viewDi…

Unbalanced calls to begin/end appearance transitionsの解決方法

アプリをビルドした際にコンソールにUnbalanced calls to begin/end appearance transitions...と出力された。 これはviewDidLoadやviewWillAppearで別ViewControllerへの遷移コードを書いていると発生する。 私はズバリ、viewWillAppearで条件に応じて別Vie…

iOS7でUITableViewCellAccessoryTypeを矢印なしのUITableViewCellAccessoryDetailDisclosureButtonにしたい場合

iOS7でUITableViewCellのUITableViewCellAccessoryTypeをUITableViewCellAccessoryDetailDisclosureButtonに設定してビルドしてみるとiOS6の時のようにボタンだけでなく、矢印も一緒に表示されてしまった。 矢印が不要だったのでUITableViewCellAccessoryTyp…

Main.storyboardとは別のstoryboardから特定のViewControllerのインスタンスを生成する方法

今更ながらStoryboardの読み込み方法。 前提としてStoryboardの読み込みたいViewConrollerにて[Show the Identity Inspector]の[Storyboard ID]に一意のIDを振っておく。 読み込み方は //Sub.storyboardの読み込み UIStoryboard *storyboard = [UIStoryboard…

CoreDataのlike句のワイルドカードを検索する方法

CoreDataでlikeを使用して文字列を検索する際にワイルドカードとなるアスタリスク*と?自身が含まれるものを検索したい場合はバックスラッシュでエスケープする必要がある。 //検索対象文字 NSString *keyword = @"*"; 検索対象文字をエスケープしてあげる k…

nilは0だからBOOL判定時とかに使用する場合は注意が必要って話

NSStringクラスのカテゴリを作成し該当の文字列が空かどうか判定するisEmptyメソッドを作った。 - (BOOL)isEmpty { if (self.length > 0u) { return NO; } return YES; } 上記メソッドを使用して空文字である場合と空文字でない場合の処理を下記のように分岐…

iOS7でスワイプによる戻る機能を無効にする方法

iOS7からスワイプすることで戻る機能が標準になりました。 いくつかのアプリではこの機能を無効にしたいと思うものもあると思います。やり方は各ViewControllerで if ([self.navigationController respondsToSelector:@selector(interactivePopGestureRecogn…

iOS7でUIWebViewのスクロール領域がおかしくなる現象

iOS7のStoryboardでUIViewControllerのviewの上にUIWebViewを配置してビルドしてみると、なぜか下にスクロールでき黒い領域が発生した。 バグなのかどうか根本的な原因はよく分からないのだが、解決方法としてはUIViewControllerのviewとUIWebViewの間にview…

OCMockの基本的な使い方

テストケースを書く際にOCMockを利用し始めたので基本的な使い方をメモ。1.テストケース対象クラス内で他のクラスのメソッドを呼び出している結果を書き換える //テスト対象クラス内で呼び出しているOtherクラスのモックを作成 id mock = [OCMockObject mock…

A view can only be associated with at most one view controller at a time!エラー

幾つかの画面(ViewController)で共通のUIActionSheetを使い回したかったので共通のUIActionSheetを管理するシングルトンクラスを生成して、そのシングルトンクラスのUIActionSheetを表示させたいViewControllerでshowFromBarButtonItemしていた。 iPadではBa…

iOS7でNavigationBar領域までViewが食い込んでしまう事象の回避方法

これまでxibファイルで[Top Bar]からNavigationBarを選択して、そのNavigationBarの下にViewを配置していたのだけれども、 iOS7でビルドするとNavigationBar領域に配置したViewが食い込んでしまっていた。コードの場合は下記で対応。 - (void)viewDidLoad { …

iOS7でstatusbar(ステータスバー)を消す方法

iOS7がリリースされましたね。 きっとNDAも解除されたろうと思いiOS7関連情報を綴ります。iOS7になったことで全体のデザインがフラットデザインになりました。 この影響で僕のアプリはステータスバーの20px領域にViewが食い込むようになってました。 ステー…

OCMockのスタブでメソッドでなくプロパティの返り値を制御する方法

テストケースを書く際にOCMockのスタブを使用してメソッドの返り値を制御することが多々あると思います。 メソッドだけじゃなくて、そのクラスで定義されているプロパティの返り値を制御するのに四苦八苦したのでメモります。 メソッドのスタブと同じように…

NSArrayのenumerateObjectsUsingBlockメソッド

配列データに該当の値が存在するか調べる際に配列データをループして調べるが、 今までは for (int i = 0; i for (id obj in array) //高速列挙 を使用していた。NSArrayにはenumerateObjectsUsingBlockメソッドがあり便利なので記述する。 @interface ViewC…

テーブルビューのページング処理(最下セルまでスクロールしたら次の○件を自動で取得して表示する)

テーブルビューで一番下のセルまでスクロールしたら自動で次の○件を取得する処理について調べた。 この処理で一番のポイントはどのタイミングで次の○件を取得して表示を更新すべきかというところ。 まず最初に試した方法はUITableViewDelegateのwillDisplayC…

UIWebViewのCookie削除方法

アプリでfacebookアカウントを使用してWebサービスログイン機能実装していた際に一度facebookアカウントでログインしてからログアウト。 その後に再度facebookログインを試みるとIDとPWを求められることなく先ほどまでログインしていたアカウントで勝手にロ…

UINavigationControllerのnavigationBar領域をViewで覆うやり方

ある処理をする際に他画面に遷移されたりボタン操作をされたくなかったので新たにViewを作成して対象画面にaddSubViewして覆っていたのだがnavigationBarの領域にあるボタンは押せてしまっていた。navigationBar領域を覆えないコード CGRect frame = self.vi…

countForFetchRequestは重複を除く件数は取得してくれない?

CoreDataを使用していて、あるカラムの重複を除いたデータの件数を取得する際に setReturnsDistinctResults:YESの設定をして managedObjectContextのcountForFetchRequestメソッドで取得したが重複を除いた件数ではなく重複を含む件数を取得してしまった。 …

TableViewのセル表示高速化 〜高さが動的に変わるセル対応編〜

表示するコンテンツの有無に応じて高さが変わるカスタムセルを表示する際にえらく時間が掛かってしまっていたのを改善したメモ。 (カスタムセルはUILabelを縦に4個配置しているもので上から順に詰めていく。UILabelの高さはすべて25.0fで固定) 時間がかかっ…