android & ios

UITableViewCellの高さが常に一定の時はrowHeightを使う

self.tableView.rowHeight = 44.0f; みたいに書く。 高さ可変のケースが多いから、他からコピペしてきて - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 44.0f; } とか書いてしまうけど、これは無駄。 セルが100個あったら、100回heightForRowAtIndexPath呼ばれるから。

[Objective-c]UIWebViewでバウンドさせない

UIWebViewでバウンドさせない方法です。 以下のコードをUIWebViewを使っているクラスに記述します。 やっていることは。UIWebViewからUIScrollViewを探して、bouncesオプションをfalseにします。 for (id subview in _webView.subviews) { if ([[subview class] isSubclassOfClass: [UIScrollView class]]) { ((UIScrollView *)subview).bounces = NO; } } 【動作】 スクロール : する バウンド : しない

[Objcetive-C]UITableViewCellの削除ボタンのラベルを変更する

UITableViewCellの削除ボタンをカスタマイズする方法です。 UITableViewDelegateのtitleForDeleteConfirmationButtonForRowAtIndexPathメソッドを実装して、ラベル名を返せばOK - (NSString *)tableView:(UITableView *)tableView titleForDeleteConfirmationButtonForRowAtIndexPath:(NSIndexPath *)indexPath { return @"さくじょ"; }

CGGeometryクラスの位置やサイズ操作系の関数紹介

はじめに 位置やサイズ、領域操作系のCGGeometryって便利だなと思って分かるところだけ簡単に調べてみました。 間違いがありましたらご指摘ください。 関数 CGSizeEqualToSize bool CGSizeEqualToSize (CGSize size1, CGSize size2); 指定した2サイズが等しいか判定する。 サンプル CGSize size1 = CGSizeMake(100, 100); CGSize size2 = CGSizeMake(100, 100); NSLog(@"result:%@", CGSizeEqualToSize(size1, size2) ? @"同じ" : @"違う"); 結果 result:同じ CGRectC...

Objective-Cで内部の変更を監視できるコレクションクラスを実装した話

objcを書いていて頻繁に感じる不便さ(百万個くらいあるけど)のひとつに、NSMutableArrayの内部のmutation(変更)を監視したいということがあると思います。 たとえば、UITableViewのコンテンツにNSMutableArrayを使うのは一般的(still obsolete!)だと思うのですが、そもそも可変のコレクションを使う前提上、コンテンツの追加/削除/入替/移動が頻繁に発生します。そういう場合はNSArray.hで宣言されている以下のようなメソッドを使うと思います 。 NSArray.h @interface NSMutabl...

XCTestの中でNSBundleにアクセスする

SampleTest.m - (void)testExample { XCTAssertNil([[NSBundle mainBundle] pathForResource:@"hoge" ofType:@"txt"],); // ない XCTAssert([[NSBundle bundleForClass:[self class]] pathForResource:@"hoge" ofType:@"txt"],); // ある }

[Objective-C] UIViewとCALayerの階層についてメモ

まだまだ勉強不足で、UIViewとCALayerの兼ね合いが曖昧なのでメモ。 最初、UIViewとCALayerは独立して存在しているのかと思っていたのだけど、どうやら階層構造はUIView、CALayerともに同じになる? (あるいはaddSubview:を実行した時点で、そのUIViewのCALayerを追加してるのかも。まだリファレンスしっかり追えてません) とりあえず動作を確認するために簡単にコードを書いてみた。 // Viewの重なりテスト self.view.backgroundColor = [UIColor colorWithRed:1 green:1 blue:1 al...

NSUserDefaultsにproperty経由でアクセスするためのカテゴリ

NSUserDefaultsは非常に便利ですが、キーの名前をハードコードするのは保守性に問題があります。 文字列定数を定義する方法もありますが、僕はカテゴリを作成して、プロパティとしてアクセスするようにしています。 メリットはざっと下記の通りです。 型制約がかけられる キーとなる文字列が一カ所で定義されるので保守が簡単になる キーとなる文字列と、propertyの名前を独立に管理できる 必要に応じてgetterをフックできる。 たとえばキーを変更した場合に、古いキーからも値を読め...

NSData の中身を見るには。

NSDataの中身を見ようとNSLogをしても人には理解し難いものなので、 そういうときはこれ。 // NSData *data unsigned long long size = 50 * 1024; const unsigned char *ptr = [data bytes]; unsigned char s[size]; for (long long i = 0L, n = [data length]; i < n; ++i) { unsigned char c = *ptr++; s[i] = c; NSLog(@"char=%c hex=%x", c, c); } NSLog(@"%s", s);

UICollectionViewのlayoutSubviewをブロックで処理する + FizzBuzzサンプル

UICollectionViewの拡張 UICollectionViewCellを使う場合、原則としてはサブクラスを作るのがオススメです。 で、それが分かった上で、それでも手を抜きたい場合にはこんなブロックがあると捗ります。 BTKCollectionViewCell.h #import <UIKit/UIKit.h> @interface BTKCollectionViewCell : UICollectionViewCell @property(copy) void (^onLayoutSubview)(BTKCollectionViewCell *cell); @end BTKCollectionViewCell.m #import "BTKCollectionViewCell.h" @implementation BTKC...

objcのクラスメソッドとインスタンスメソッドの違い

は、ありません。 http://qiita.com/keroxp/items/43ed73f3ca7566d6c76c でも述べたんですが。もう少し踏み込んで。 objcのクラスにはクラスメソッドがあります。 あまり知られていませんがクラスメソッドとインスタンスメソッドの違いは実はあんまりないのです。 例えば、NSObject ClassにはconformsToProtocol:というセレクタのメソッドが、クラスメソッドとインスタンスメソッドと両方ありますが、セレクタだけではその判別は出来ません。なのでこんなこともできます。 ObjcTests.m...

セレクタからメソッドシグネチャの引数の数を調べる

- (NSUInteger)argc:(SEL)sel { return [[NSStringFromSelector(sel) componentsSeparatedByString:@":"] count]; } 原始的ですが。 ※2014/02/22 @tomohisaota さんから教えていただきました。 recieverが分かっている場合はNSMethodSignatureを使うほうが良さそうです。 - (NSUInteger)argc:(SEL)sel { NSLog(@"%d",[self methodSignatureForSelector:@selector(viewDidAppear:)].numberOfArguments); // => 2 + 1 = 3 } ※ 2014/02/22 追加 NSObjectのmethodSignatureFor...

TestFlightとDeployGateを比較してみた(その1)

これまでiOSアプリ配布といえばTestFlightが鉄板でしたが、ついにDeployGateがiOSアプリに対応しました。 そこでTestFlightとDeployGateを使ったiOSアプリ配布について比較してみました。 共通してできること AdHoc版アプリを配布できる 現時点で共通した機能はAdHoc版アプリの配布だけでしょうか。 今後Deploygateの機能追加により以下の機能も共通してできることになりそうです。 クラッシュレポートを管理画面で確認する アプリのインストール状況や端末の情報を確認する アプリの...

Custom Transitions Using View Controllers

参考: Custom Transitions Using View Controllers - WWDC2013 session 218 サンプル: github/335g/CustomTransitionSamples iOS Advent Calendar 2013 13日目担当の@335gです。 個人的事情で11月ぐらいからようやく触り始めたiOS7。色々新しい事は増えてるみたいですが、WWDCの時から気になってたのが今回のテーマ「Custom Transitions」です。ベータ版のカレンダーをいじりながらどうやるんだろうなんて妄想したものです。 はじめに まずはざっくり説明します。その後、いじってては...

別のアプリを開く

Safari [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://yahoo.co.jp"]] App Store 単に開くだけなら以下。 [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"http://itunes.apple.com/jp/app/"]];

Xcodeのコード補完が超絶便利になるプラグイン

FuzzyAutocompletePlugin Xcodeのコード補完機能がファジー(曖昧)になり、かなり使いやすいです。 GitHub:https://github.com/chendo/FuzzyAutocompletePlugin 導入方法 初めてプラグイン導入手順はこちらを参照してください。 初めてのXcodeプラグイン導入手順 $ git clone https://github.com/chendo/FuzzyAutocompletePlugin.git $ cd FuzzyAutocompletePlugin $ xcodebuild -project FuzzyAutocomplete.xcodeproj build これだけです。 あとはXcodeを再起動すれば、導入完了です。...

Appleのサンプルで学ぶUISearchDisplayControllerの使い方

Appleの公開している2つのサンプルでUISearchDisplayControllerの使い方をメモしておく。 UISearchDisplayControllerとは 検索画面で検索したらリアルタイムに候補がUITableViewに表示されるやつ。 サンプルについて Appleは2つのサンプルを公開している。CoreDataなどを使わないシンプルなものなのでこれを読むのが一番良い。 1つ目。Simple UISearchBar with State Restoration https://developer.apple.com/library/ios/samplecode/TableSearch/Introduction/Intro.html 入力され...

iOS7でViewController単位でStatus Barを表示したり非表示にしたりする

Project-Info.plistのUIViewControllerBasedStatusBarAppearanceの NO に設定する。 Status Barの表示を制御したいViewControllerに次のようなコードを追加 - (void)viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; // 表示するときは`setStatusBarHidden`のパラメタを **FALSE** に設定する [[UIApplication sharedApplication] setStatusBarHidden:TRUE withAnimation:UIStatusBarAnimationFade]; }

備忘録:Objective-C クラスやインスタンスが、指定のプロトコルに適合しているかどうかをチェックする方法

以下のメソッドを使えば、あるクラスまたはインスタンスが指定のプロトコルに適合しているかどうかをチェックできる。 + (BOOL)conformsToProtocol:(Protocol *)protocol; - (BOOL)conformsToProtocol:(Protocol *)protocol; サンプル id obj = ....; if ( [obj conformsToProtocol:@protocol(FooProtocol)] ) { id<FooProtocol> fooObj = obj; ... ... }

NSString stringWithFormatにおける、position指定

NSStringのformat指定 NSStringおよびNSLogのフォーマットには、IEEE準拠のposition指定を使うことができます。 クラスリファレンスをよく読んでみると、さらっと書いてあります。大事なことなのに。 String Format Specifiers Note that you can also use the “n$” positional specifiers such as %[email protected] %2$s. For more details, see the IEEE printf specification. 今までもこの機能を多言語対応で使っていたのですが、今日新たな発見を二つしました。 同じポジションを複数回使用...