2013年12月30日月曜日

UITableViewでセル選択をしない様にする。

UITableViewでセル選択をしない様にする、、というか選択したすぐさま選択を解除する。

とりあえず、コードを見てみる。

    
//
// UITableViewDelegate
//
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [tableView deselectRowAtIndexPath:indexPath animated:YES];
    return ;
}

「didSelectRowAtIndexPath」は選択した時のdelegateメソッドですが、すぐさま「deselectRowAtIndexPath:indexPath」を利用して、選択解除状態にします。

これで、テーブルを利用した「単純なリスト」の作成が出来ます。
この方法を利用すると、いちいち位置替えをするのが楽になります。

2013年9月11日水曜日

iPhone5S/5C が発表されました。

Appleの新製品、iPhone5S/5C が発表されましたね。

iPhone5S
http://www.apple.com/jp/iphone-5s/

iPhone5C
http://www.apple.com/jp/iphone-5c/

5Sの新機能はこんな感じ
  • CPUがA7チップ(iPhone5はA6チップでしたね)
  • バッテリー寿命(寿命というよりは容量だと思います)
  • カメラの手ぶれ防止機能、連続撮影機能(これはチップを変えて性能アップした分をまわした感じですね)
  • 指紋認証機能
5Cは基本的にiPhone5の廉価版的な位置づけですね。
  • 素材の強化ポリカーボネート化
  • カラーバリエーションは5色(ホワイト、ピンク、グリーン、イエロー、ブルー)

エンジニアとしては、やはりCPUの強化、ユーザとしてはバッテリーですね。

正直なところ、CPUが良くなる事は開発面に置いてはあまり好ましくなくて、
「メモリの使い過ぎ」や「CPUパワーの使い過ぎ」を視認しにくくなるのです。

ただ、これは私がエンタープライズ系のエンジニアだからであって、エンタメ系のエンジニアとってはとても喜ばしい事だと思います。
(私もなんどもエンタメ系に移行しようとして失敗しているので、うらやましい限りです。)


さて、明後日の9/13(金)からヨドバシでは予約受付を開始の様です。
(追記:9/13 13:29 iPhone5Cが予約開始の模様です。iPhone5Sは未定)

私も会社後にそうそうに行ってみようと思います。(混んでそうですが。)
そもそも、もう私のiPhone4Sは使い続けていると熱いんですよね。

結局、当日に予約しても受け取りにはまだまだかかるでしょうから、それまでに格好の良いケースを見つけたいと思います。
iPhone5とサイズ(縦/横/高)は変わっていませんので、ボタンやカメラの配置が動いてなければ問題ないでしょう。
iOS7が標準になってデザインは変わりましたが、ハード的には5から5Sなので大丈夫だと思います。


我の周りには私が自由にできる端末が結構あるのですが、
開発がしやすいように、特に理由が無ければiOSのメジャーアップデートは行いません。
iPad(iOS5)
iPad2(iOS6)
iPod(iOS3) (もう使えないね)
iPhone3GS(iOS6) x2
iPhone4(iOS6)
iPhone4S(iOS5)

今度別の記事で書きますが、今のiOSのSDKには、iOS5以前とiOS6以降で同じ意味なのに定義名を変えられているdefineが結構あります。

それを考えると、iPhone4S(iOS5)はiOS6にあげてしまうのも手かも知れません。

どこかが、現在のOSのシェアを発表していただけると、かなり嬉しいのですが。。。



2013年9月4日水曜日

新しいApple Developerのコンソール画面で新たなProvisioning Profilesが作成できない。

Apple Developerのコンソールが新しくなって久しいですが、
新しくアプリを作成しようとProvisioning Profilesを作成しようとすると、 ぐるぐるが表示されてなかなか進まない事があります。

 以下の様な状況

これはGoogle Chromeだと発生するのですが、普通に画面エラーの様ですので、このまま待っても進みません。
Firefoxなどのブラウザに切り替えて作業を進めましょう。

2013年7月18日木曜日

NSString文字列を検索する

NSStringには一般的に利用する文字列検索「前方一致」「後方一致」「あいまい」「完全一致」の検索方法が始めから備わっています。

利用方法は以下通りです。

    
NSString *text = @"abcdefg";

if([text hasPrefix:@"abc"] == YES)
{
    NSLog(@"文字列の先頭はabcです。");
}

if([text hasSuffix:@"efg"] == YES)
{
    NSLog(@"文字列の末尾はefgです。");
}

if([text isEqualToString:@"abcdefg"] == YES)
{
    NSLog(@"文字列はabcdefgです。");
}

if([text rangeOfString:@"cde"].location != NSNotFound)
{
    NSLog(@"文字列にcdeが含まれます。");
}


上記を実行するとコンソールには以下の様な結果が表示されます。

    
文字列の先頭はabcです。
文字列の末尾はefgです。
文字列はabcdefgです。
文字列にcdeが含まれます。

2013年7月16日火曜日

ボタン上の文字列を折り返す

UIButtonに長い文字列を設定した場合。
以下の様に、大変不格好な縮められ方をする場合があります。


// ボタン生成
 UIButton *textButton = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 240, 240)];
 [textButton setTitle:@"あいうえおかきくけこさしすせそたちつてと" forState:UIControlStateNormal];



こんな時は、自動で改行してくれるように設定しましょう。


// 行数を"無制限"に設定する。
[[textButton titleLabel] setNumberOfLines:0];


うまく出来ました。

こういった場合で、「2行分しかスペースが無いが、出来る限り表示したい」という場合は、以下の様な設定。



// 行数を"2行"に設定する。
[[textButton titleLabel] setNumberOfLines:2];


後はもうフォントサイズを小さくするくらいしか手立てはありませんね。

2013年7月4日木曜日

アプリのステータスバーを消す方法







この上部の時間が表示されているところを消す方法を毎回忘れてしまうので、備忘録。


// ステータスバーを消す
[[UIApplication sharedApplication] setStatusBarHidden:YES];

// ステータスバーを出す
[[UIApplication sharedApplication] setStatusBarHidden:NO];

こうだ!

2013年6月25日火曜日

UINavigationController内のIUTableViewControllerにタイトル・tintColorが設定できない。

UINavigationController作成して、内部にUITableViewControllerを設定した時に、どれに対して、titleとtintColorの設定をしていいか未だにわからなくなってしまいます。


// UINavigationControllerの初期化
// UITableViewController *_tableViewController; で定義してます。
[self set_tableViewController:[[UITableViewController alloc] initWithStyle:UITableViewStyleGrouped]];
[[[self _tableViewController] tableView] setDataSource:self];
[[[self _tableViewController] tableView] setDelegate:self];
[self addChildViewController:[self _tableViewController]];

// この場合のtitle設定はこう
[[self _tableViewController] setTitle:@"プロフィール"];

// tintColor設定はこう
[[[[self _tableViewController] navigationController] navigationBar] setTintColor:[UIColor orangeColor]];


2013年6月17日月曜日

WEBページを取得してHTTPステータスコードを確認する。

APIを利用したアプリ等を作成する場合に、「このAPIが使えたら使うけど、使えなかったらこっちを使いたい」という様な場合があるかと思います。

そんな時に、HTTPのステータスコードが確認できると便利ですね。
以下のコードで確認します。


// リクエスト初期化
NSMutableURLRequest *request = [NSMutableURLRequest alloc] init];
[request setURL:[NSURL URLWithString:@"http://example.com/api.php"]];
[request setTimeoutInterval:15.0f];
[request setHTTPMethod:@"GET"];

// 実際のリクエスト
NSURLResponse *response;
NSError *error;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error];

// ステータスコード判別
int statusCode = [(NSHTTPURLResponse *)response statusCode];

// もしくは
// int statusCode = [[response valueForKey:@"statusCode"] intValue];

if(statusCode == 404)
{
    // エラー処理など
}

この様にします。
ステータスコードの取り方は上記の様に2パターンありますが、同じデータを指していますので、コーディングスタイルによって使い分けてください。

2013年6月14日金曜日

アプリ申請時にUDIDの件でInvalid Binary となる ... その後解決

先日の記事でアプリにAdMobを組み込んでAppleに申請するとUDID の件で弾かれると書いたかと思います。
http://startup-objc.blogspot.jp/2013/05/udidinvalid-binary.html

これが、AdMobライブラリに非があるのか、Appleの検査モジュールが誤検知したのかわかりませんが、広告を非表示にするという事でアップしました。
(元々広告収入を目的とするアプリでは無かったため。)



今回、アプリを更新する事案がありましたので、再度広告表示に挑戦しました。

一番の疑わしきはAdMob。
ライブラリのページを見てみると。。。
https://developers.google.com/mobile-ads-sdk/download











バージョン上がってるやないかい!
前回は6.4.1だったのが6.4.2、やっぱりこれか・・・


新しいのをダウンロード&展開して、組み込み!
クリーン&アーカイブしてアップ!



























だめか・・・



こういう時はstackoverflowに助けを求める
http://stackoverflow.com/questions/16409966/app-rejected-but-i-dont-use-udid

ibGoogleAnalytics_debug.a が含まれていて、悪さをしているとの事。
罠かよ・・・

ターミナルで以下を実行して、バイナリ内で利用している箇所を探せとあったので、実行してみたところ。
find . | grep -v .svn  | grep "\.a" | grep -v "\.app" | xargs grep uniqueIdentifier


























確かにある。これだな。削除。


再度、クリーン&アーカイブしてアップ!



























だめだな・・・


もしかしてと思いプロジェクトファイルを開く。エディタで。










思った通りや・・・

ライブラリ更新の度にディレクトリ作って追加していったから、
検索パスがその度に増えていました・・・

プロジェクトファイルからの直削除はこわかったので、
xcodeから削除。
















※画像は勢い余って消してしまった後のものです。


再度、クリーン&アーカイブしてアップ!

。。。成功やー!



結局、何が原因かというと、検索パス内に以前のライブラリへのパスが残っていた事が原因。
xcode内で、視覚的にファイルを消したとしても、検索パスには残る。
再度、別のファイルを追加してバージョンアップしている風にはxcode上は見えるんだけど、実際には「検索パスが新たに追加される」ことと「ファイル名単位のファイルパス」が追加されるようです。

そのため、検索パスの最初にあるAdmobの6.2.1の「同名ファイル」が選択されてAppleに弾かれていた模様。。。

もちろん、ibGoogleAnalytics_debug.aのファイルを消した事も影響しているかも知れないけど、検証しなおす余力がありません。

最終的なまとめとしては、検索パスをチェック。


なお、こういう目に遭うのは、ライブラリをバージョン別に分けて管理したがる僕みたいなタイプの人間で、ライブラリを上書き更新かけるタイプの方は、問題ない模様。
(twitterとか見たけど、みんな普通に出来ているしね。。。)


2013年6月11日火曜日

WWDC2013にてMac OS X 10.9発表

iOS7 に続き Mac OS X 10.9 も発表になった模様です。

ガジェット速報

正直なところ大きく変ったところはあまり無く、基本的にはスペックアップ版と考えて良いのではないでしょうか?

気になるのは今回のコードネームが「Mavericks」ということ、「もうネコ科の動物がいなくなってしまった」との事ですが、結構いるんじゃないのネコ科。
正直、雪豹ってメジャーな動物じゃなかったよね。そういうのいっぱいいるんじゃないの?
(分かりません、ごめんなさい。)

私は、今のところ時期xcodeの動作条件が10.9になるまで待つつもりでおります。

WWDC2013にてiOS7発表

iTMedia
http://www.itmedia.co.jp/mobile/articles/1306/11/news039.html


いくつかのサイトで説明がされていますが、新機能を一応紹介しておきます。

コントロールセンター

機内モードや、Wi-Fi設定、Bluetoothの設定が簡単に出来るショートカットの様なもので、Androidではよくウィジットとして表示されているようなものです。
この機能が欲しくて脱獄している人もいるくらいなので、待望の機能といえるでしょう。


マルチタスク

一番の衝撃はこの機能です。
今まで利用中のアプリがバックグラウンドタスクに移行した際には、最大10分間しか動作できませんでした。
みんなあの手この手でその10分間を延ばし延ばし頑張ってみたり、チューニングを必死にやったりしていましたが、その必要がなくなりそうです。

仕様はまだ詳しくは分かりませんが、「制限のないバックグラウンド音楽プレイヤー」なども作れるかもしれませんし、「youtudeの作業用動画を音声だけ聞く形での音楽プレイヤー」ということも出来るかもしれません。

また、アプリ開発者がアプリ内でのバッチ処理のチューニングを怠ったり、大きなリソースを握ったままバックグラウンド側にいく事によるリソース不足が懸念されます。

バックグラウンドでの連続動作が許されるということは、ようはサーバーとして動作することが可能になるということと同意だと思いますので、やろうと思えば結構悪いことが出来ます。
Appleにはアプリの精査をより一層厳しく行っていただきたいと思います。
※幾分か妄想が含まれております。


Air Drop

これは、すでにMACに搭載されている機能ですが、端末間のファイル共有機能ですね。
今までのiPhoneではなるだけファイルを意識させないような設計をしていたかと思いますが、そのあたりどうなのでしょうか?

「ファイル」の対象となるのはどういったものなのかが気になるところです。
写真、連絡先、カレンダーの予定、safariブックマーク、iBooks内のPDFデータなどが対象になると思います。

単純に考えて、ZIPなどの「再生」出来ないようなファイルは対象外かとも思いますが、
個人的には、端末間のファイル移動に使うUSBの代わりとして、簡単に使えると便利です。



safari

画像は探していただくとお分かりになると思いますが、現在chromeアプリで実装されているレイアウトに非常に似ていますね。
良いと思います。



iTunes Radio

これは、はっきり申しまして何がなんだか分かりません。
というのも、日本では権利の関係で非常に実現の難しい機能だと思います。

全国のラジオ局が協力してradikoを運営しているにも関わらず、地方のユーザが別の地方のラジオ放送を視聴するには至っておりませんから。。。

インターネットラジオ局が新規に立ち上がる、、、音泉のプラットフォームがiTunes Radioに移行される、、、ぐらいがここ数年で実現できる範囲ではないかと思います。



App Storeによるアプリの自動アップデート

これは、アプリ開発者にとっては、ちょっと怖い機能です。
というのも、アプリによっては「今日新バージョンのアプリがアップされたけど、バグ見つかったからみんなアップデートはちょっと待ってね」なんて発表しても後の祭りな訳です。アフターフェスティバル。

iTunes connectで自動アップデートの対象かどうかの設定が有ると良いのですが。。。

また逆に「古いサーバーと通信しているアプリの向け先を新サーバーにしたいからみんな早くアップデートしてくれ!」って時のための強制アップデート通知を送れると嬉しかったりします。



本日より、開発者向けにiOS7のプレビュー版とxcode5が配布されているらしい事で、
早速確認してみましたが、おそらくはいつものごとくサポート無しの、ダウングレード不可だと思いますので、もう少し様子を見ます。

アップデートしましたら、このブログで報告いたします。

2013年5月7日火曜日

アプリ申請時にUDIDの件でInvalid Binary となる


何の気なしに、アプリを更新申請すると以下の様なメールが届いた。

Non-public API usage:
  • Apps are not permitted to access the UDID and must not use the uniqueIdentifier method of UIDevice. Please update your apps and servers to associate users with the Vendor or Advertising identifiers introduced in iOS 6.
どうやら、UIDevice の uniqueIdentifier は非推奨APIになったので、利用したものは受け付けないよ。

との事らしい。。。
(2013年5月1日よりそうなった模様)

急いで修正&更新申請したが、同様のメールが届けられる。。。




外部ライブラリだ!
と閃き、AdMobのサイトに行くと、案の定ライブラリが更新されている。

今までは6.2.1のバージョンを利用していたが、6.4.1を導入。

だがまたAppleから突き返される。。。


ここで試しにXcode をバージョンアップ、もしかして本来は入っていなければならないライブラリをバージョンアップを怠った事によって入れていなかったのかな・・・と


これも関係なく弾かれる。。。


どう考えても怪しいのはAdMobのライブラリ。
そこで試しにライブラリをアプリ内から除去。


問題なく申請が通る・・・おい!



Twitterとかで調べても、みんな「6.4.0以降は大丈夫だ」とつぶやいていたが、6.4.0は大丈夫だったかもしれないが6.4.1は駄目な模様。
そして、6.4.0に関してはもうダウンロードできない。

とりあえず広告非表示の件は適当な理由を付けて、申請しました。


実際に、AdMobでUDIDを利用しているのかは不明ですが、
Appleにバイナリを申請した際には、「そう検知される」


ぐぬぬ。


追記(2013-06-20):

以下の対応でAdMobが利用できるかも知れません。
http://startup-objc.blogspot.jp/2013/06/udidinvalid-binary.html

PCH file built from a different branch ((clang-425.0.24)) than the compiler ((clang-425.0.28)) というエラーが発生


PCH file built from a different branch ((clang-425.0.24)) than the compiler ((clang-425.0.28))

のエラーが発生、とりあえず「Derivered Data」と「Clean」を実行したらエラー解消。

Xcodeのバージョンアップをしたので、何かのキャッシュが残っていたのかも・・・

2013年4月26日金曜日

UILocalNotification の soundName でハマる

UILocalNotification には soundName というプロパティがあるのをご存知でしょうか?

実はこのプロパティに音声ファイル名を設定すると通知時の音を変更できるのですが、、、


何度やっても音が再生されない。。。


実はここに設定できる音声ファイルは長さが30秒のものまでなのです。

stackoverflowに書いてありました。
http://stackoverflow.com/questions/6543726/how-do-i-play-an-alarm-sound-for-more-than-30-seconds-like-the-alarm-clock-pro-a

これで、小一時間ハマりました。

とりあえず、GWに持ち込まなかっただけ良かったとします。

ちなみに30秒を超える長さのファイルを設定した場合は、デフォルトの通知音が鳴ります。

UITableViewのセルの下線をシンプルにしたい

UITableViewをグループ表示(UITableViewStyleGrouped)で表示すると、セルになんか変な白いのが表示されます。
実はこれはセルの影という事なのですが、これをシンプルな1ラインにしたい事もあるかと思います。

デフォルトはこの様な表示








テーブルビューに以下の様な設定をすると、すっきりしたラインになります。

[tableView setSeparatorStyle:UITableViewCellSeparatorStyleSingleLine];

この様な感じ。

2013年4月25日木曜日

UISegmentedControl の文字が小さい









この画像を見て、UIControlSegmented内の文字列は大きいと感じますか?小さいと感じますか?
私は小さいと感じますので、デフォルトの文字サイズから変更したいと思います。

ですが、UIControlSegmented には各アイテムの文字サイズを変更するメソッドは用意されていません。
しかし、各アイテムの文字の設定を変更するメソッドは用意されています。


- (void)setTitleTextAttributes:(NSDictionary *)attributes forState:(UIControlState)state;

(iOS5からですね。)


今回は試しにフォントサイズを16で太字に変更してみましょう。
UISegmentedControl *monthSegmented = [[UISegmentedControl alloc] initWithFrame:CGRectMake(8, 4, 304, 32)];
[monthSegmented setTitleTextAttributes:@{ UITextAttributeFont:[UIFont boldSystemFontOfSize:16],   } forState:UIControlStateNormal];









見やすくはなったのでは無いでしょうか?

どの様な項目が変更できるかは UIStringDrawing.h に記述されています。

UIKIT_EXTERN NSString *const UITextAttributeFont;             // フォント
UIKIT_EXTERN NSString *const UITextAttributeTextColor;        // 文字色
UIKIT_EXTERN NSString *const UITextAttributeTextShadowColor;  // 文字影色
UIKIT_EXTERN NSString *const UITextAttributeTextShadowOffset; // 文字影幅
一通りはいじれるようですね。

2013年4月23日火曜日

CoreDataのSQL実行ログをXCodeのログビューに吐き出す

アプリの実行中にSQLのログを吐き出させたい時があると思います。

設定方法は以下のような手順

1.Xcodeの左上のアプリ名のところをクリックして「Edit Scheme...」をします。

2.「Run アプリ名」の「Arguments」タブ。
「Arguments Passed On Launch」の箇所に「-com.apple.CoreData.SQLDebug 1」と入力します。
3.表示されます。


2013年4月22日月曜日

UIImageVIewで画像を貼付けると歪む

皆さん画像をviewに貼付ける時は、以下のようなコードを利用すると思います。

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
[imageView setImage: [UIImage imageNamed:@"hoge.png"]];
[[self view] addSubview:imageView];

ただ、この方法でうまく行くのは画像サイズが320x240の時だけで、その他のサイズの場合は、勝手に伸び縮みしてしまいます。

「ちょっと見苦しい」だけですめばいいのですが、人間の画像の場合は後から何を言われるかわからないのでヒヤヒヤものです。

そんな場合は1行コードを足してあげましょう。
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 320, 240)];
[imageView setContentMode:UIViewContentModeScaleAspectFit]; // ここを追加
[imageView setImage: [UIImage imageNamed:@"hoge.png"]];
[[self view] addSubview:imageView];

ContentMode プロパティに UIViewContentModeScaleAspectFit を設定するだけで、勝手にアスペクト比を保った拡大縮小をしてくれます。


※この手法は、webなどから画像を引用してきた際などの画像サイズが一定では無い場合に有用です。最初から画像のサイズがわかっている場合は、面倒臭がらず画像修正ソフトでリサイズする事をオススメします。

2013年4月9日火曜日

【朗報】AppleDeveloperで一度登録したAppIDが消せるようになりました。

前々より、AppleDeveloperで登録したAppIDが削除できないという事で、テスト的に登録したAppIDが目障りで仕方なかったそこのあなた!朗報です。消せるようになりました。

https://developer.apple.com/membercenter/index.action

消せるAppIDの条件は「AppStoreで公開しているアプリで利用していない事」だと思いますので、
出来心で登録してしまったIDは消せる模様です。

削除の仕方は以下の通り。

  1. AppleDeveloper MemberCenter にログイン
  2. Certificates, Identifiers & Profiles にアクセス
  3. Identifiers にアクセス
  4. App IDs にアクセス
  5. 消したいAppID の行を選択
  6. Settings ボタンを押下
  7. 下の方に Delete ボタンが配置されています
簡単!



さきほどAppleから、「See what's new in Member Center.」とメールが来て気づいたので、今日(2013/04/09)からだと思います。

操作画面のスクショがあれば分かりやすいのでしこしことブログに貼り付ける準備をしていたのですが、
「あれ、これってログイン後の画面だから勝手にアップするのは危険だな。。。」って思ってやめました(^^;)

2013年4月2日火曜日

nend広告で"IE430: Ad is out of stock. info"エラーがでて広告が表示されない。

nend広告で、以下の様なエラーが出る場合があります。

[nendSDK Error] IE430: Ad is out of stock. info[statuscode=501].

これは、広告切れの場合に表示されるエラーだそうなのですが、複数のiPhoneで試しても1台だけこのエラーが吐き出され、広告が表示されないという場合がありました。

私の場合は、その対象のiPhoneを英語モードにしていた事が原因でした。

nend広告は日本の業者ですし、英語広告のストックがそうそう無い事にはうなずけます。
(これは、私の場合の解決策ですので、英語広告のストック切れというのは仮説です。)

iOS6のUITableViewで背景色が変わらない

iOS5でUITableViewの背景処理を変更する場合、以下の様なコードで背景色を変更します。

[[self tableView] setBackgroundColor:[UIColor redColor]];


ですが、このコードではiOS6の背景色は変わりません。
以下の様にする必要があります。

[[self tableView] setBackgroundView:nil];
[[self tableView] setBackgroundColor:[UIColor redColor]];

一旦、背景ビューを nil にしてしまわないと、背景ビューの方が優先されてしまい、背景色の変更が表示されません。
おそらく、背景色を設定しているビューの上に、背景ビューを載せているのでしょう。

色変更をしたい場合ですから、ビューの方を nil にしても問題ありません。
iOS5でも特別エラーやワーニングも出ません。

2013年3月29日金曜日

iPhoneアプリアップ時に4インチのスクリーンショットを要求される

iPhoneアプリをiTunes Connectでアップする際に、アップはできるがエラー表示になる場合があります。

これはスクリーンショット画像に4インチの画像が無い場合に発生しますのでご注意ください。




というのがiPhone5が発売されてからの開発者界隈のお話だったのですが、
本日仕事で、半年近く放置していたアプリをアップロードしたところ、4インチ画像が無いにも関わらず、エラーは無く「Waiting For Review」の表示に・・・

変更になったのかも知れません。

2013年3月24日日曜日

UIScrollViewでバウンドしない様にする

UIScrollViewではデフォルトでスクロール時にバウンドするように設定されていますが、
これはUI上おっさんには厳しかったりします。(参照)


UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,240)];

[scroll setBounces:NO];

バウンドをする事によって、ボタン等のタッチをしてもらいたい箇所がずれますので、誤タッチをまねきます。
誤タッチの先が広告くらいなら、まぁなんとも無いのですが、
業務アプリ等の場合は使用者のミスでありながら、アプリのせいになる事は日常茶飯事です。

私事ですが、SIer勤務していた際に顧客にトリプルクリックを出来るおっさんがいて、旅費の精算が2重に出来てしまうというトラブルがありました。

また、別の会社ではクアドロプルクリックというスキルを持つおっさんにあった事もあります。(さすがにこれは1人しか知りませんが・・)

スクロールがバウンドするというUIは非常に表示効果が高く、個人的には好きなのですが、利用ユーザがおっさん層以上の年配者にターゲティングするばあいは、設定しておいた方が良いかと思います。

また、バウンドするのがデフォルトで設定されているという事はAppleがそれを推奨しているからに違いなく、出来る事なら外したくはないものです。。。

UIScrollViewをページ単位でスクロールさせる


ギャラリー系のアプリを作りたい時にUIScrollViewをページ単位でスクロールしたい時があると思います。

そんな時、画像の途中でスクロールが止まってしまうと不格好ですので、ページ単位でスクロール出来るように設定しましょう。


UIScrollView *scroll = [[UIScrollView alloc] initWithFrame:CGRectMake(0,0,320,240)];

[scroll setPagingEnabled:YES];

これだけです、簡単ですね。

2013年2月15日金曜日

Unused variable 'xxx' となる・・・

例えば、以下のような定義をしたときに Unused variable 'xxx' のワーニングが出る場合がある。

static const NSString *xxx = @"xxx";


Xcodeや、プリコンパイラのバージョンに依存するかもしれないけど、上記の定義でワーニングが出る場合は、constの位置が関係している。

以下の様に変更するとワーニングはなくなる。
static NSString * const xxx = @"xxx";

2013年2月4日月曜日

AdMobをiOSアプリに組み込む際の注意

AdMob導入方法を以下のページで確認する際、
https://developers.google.com/mobile-ads-sdk/docs/ios/fundamentals

日本語訳の方で見ると、以下のフレームワークを追加するように書いてある。

  • AudioToolbox
  • MessageUI
  • SystemConfiguration
  • CoreGraphics

が、実際には以下のフレームワークも必要。


  • StoreKit
  • AdSupport

英語版のページを見るとちゃんと書いてある。
訳が古いのかな?


2013年2月2日土曜日

実機転送時にエラーがでる。Code Sign error: Certificate identity 'iPhone Developer: <自分の名前>' appears more than once in the keychain. The codesign tool requires there only be one.

実機転送時にエラーがでる。
Code Sign error: Certificate identity 'iPhone Developer: <自分の名前>' appears more than once in the keychain. The codesign tool requires there only be one.

これで検索すると、「キーチェーン内に同じ証明書の期限切れが複数あるから消してね」っていう記事が見つかるんだけど、僕の場合は見つからない。。。



小一時間悩んで、気づいたのは「有効期限切れの証明書」が表示されないようになってました。。。

設定を変更して、ok!
赤い×マークが出るので消していけば、ビルドが通るはずです。

2013年2月1日金曜日

変数命名時にseから始まる名称はやめよう

変数命名時にseから始まる変数名はなるべく回避しよう。

「self」と入力しようとして「se」と打った段階で、
Xcodeのコードアシスト機能で、self以外の変数が選択されてしまう場合があります。
(私の場合は高確率で。。。)

NSString *searchName; なんて変数を作りたいときがありますが、
NSString *conditionName; とかにするといいかも

文字列から数字に変換したい

NSStringクラスには、格納した文字列をプリミティブな型に変換するメソッドが登録されています。

// double型に変換
- (double) doubleValue;

// float型に変換
- (float) floatValue;

// int型に変換
- (int) intValue;

// NSInteger型に変換
- (NSInteger) integerValue;

// long long型に変換
- (long long) longLongValue;

// BOOL型に変換
- (BOOL) boolValue;  

例えば、以下の様な文字列を変換した場合はどうなるでしょう。
NSString *temp = @"1.23";

この様に変換されます。
NSString *temp = @"1.23";
[temp doubleValue];   // (double)1.23
[temp floatValue];    // (float)1.23
[temp intValue];      // (int)1
[temp integerValue];  // (NSInteger)1
[temp longLongValue]; // (long long)1
[temp boolValue];     // (BOOL)YES


ここで少し数値を上げてみます。
NSString *temp = @"1.78";

この様に変換されます。
NSString *temp = @"1.78";
[temp doubleValue];   // (double)1.78
[temp floatValue];    // (float)1.78
[temp intValue];      // (int)1
[temp integerValue];  // (NSInteger)1
[temp longLongValue]; // (long long)1
[temp boolValue];     // (BOOL)YES

まぁ、自動で四捨五入される様な仕様にはなってないですね^^;
勝手にされても困りますが。。。


次に文字列でやってみます。
NSString *temp = @"aaa";
[temp doubleValue];   // (double)0
[temp floatValue];    // (float)0
[temp intValue];      // (int)0
[temp integerValue];  // (NSInteger)0
[temp longLongValue]; // (long long)0
[temp boolValue];     // (BOOL)NO

ゼロになりますので、判断する必要が出た時はこれで良さそうですね。


数値混入でやってみます。
NSString *temp = @"a11";
[temp doubleValue];   // (double)0
[temp floatValue];    // (float)0
[temp intValue];      // (int)0
[temp integerValue];  // (NSInteger)0
[temp longLongValue]; // (long long)0
[temp boolValue];     // (BOOL)NO


数値混入で、先ほどの順序逆転でやってみます。
NSString *temp = @"11a";
[temp doubleValue];   // (double)11
[temp floatValue];    // (float)11
[temp intValue];      // (int)11
[temp integerValue];  // (NSInteger)11
[temp longLongValue]; // (long long)11
[temp boolValue];     // (BOOL)YES

どうやら、解釈の及ぶ所までは頑張って変換してくれるみたいです。