まいまいワークス

主にiPhoneアプリの開発で考えた事、調べた事、感じた事などを記していきます。

ペーパープロトタイピング用のステンシルを入手しました

UI Stencilsで購入しました。

IMG_3824.JPG

ステンレス製のステンシルシートと専用の用紙。

用紙の方は、ポストイット的な裏面にのりが付いてるタイプと ノート型の3連タイプを入手しました

IMG_3825.JPG

実寸の140%のサイズなので、ほかのペーパープロトタイピング用紙には使えないと思います。

PDFも配布されているので、ステンシルシートさえ入手すればいくらでも画面設計ができそうですね。

IMG_3827.JPG

iOS7対応なので2月1日以降も安心ですねw

アプリ実行中にステータスバーのサイズが変更された際の対処

通話中やテザリング中などはステータスバーのサイズが変更されるので ビューの表示の際には [[UIScreen mainScreen] applicationFrame].size.height

を使ってアプリケーションエリアのサイズを取得し、これを基準にビューの表示を行いましょう!と言うおはなし。

但し、ビューの表示中にステータスバーの変更があった場合は 通知かデリゲートでイベントをフックし必要があれば再描画等の処理を行います。 (通知の設定を行った際は通知解除も忘れずに)

通知の設定

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarWillChange) name:UIApplicationWillChangeStatusBarFrameNotification object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(statusBarDidChange) name:UIApplicationDidChangeStatusBarFrameNotification object:nil];

デリゲートメソッド

- (void)application:(UIApplication *)application didChangeStatusBarFrame:(CGRect)oldStatusBarFrame{
//  NSLog(@"appHeightDidChange=%f",[[UIScreen mainScreen] applicationFrame].size.height);
}

- (void)application:(UIApplication *)application willChangeStatusBarFrame:(CGRect)newStatusBarFrame{
//  NSLog(@"appHeightWillChange=%f",[[UIScreen mainScreen] applicationFrame].size.height);
}

iPhoneとiPadの判別

端末の判別に[[UIDevice currentDevice].modelを使用する事がありますが、このやり方だとiPhone, iPad, iPodTouch, iPhone Simulator, iPad Simulatorの値が返ってくるため、単純にユニバーサルアプリ等でiPhone, ipadの判別をしたい場合は処理が煩雑になったりします。

ここは素直にUniversalアプリのテンプレに従って

iPhone

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone

iPad

[[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad

で判別し、例えば

#define is_iPad ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad ? YES:NO)

このようなマクロを設定しておくのが良さそう。

使用例

#define is_iPad ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPad ? YES:NO)

NSLog(@"iPad=%d",is_iPad);

//iPhone
iPad=0

//iPad
iPad=1

モーダルビューの背後のナビゲーションコントローラー, タブバーコントローラーを操作する

モーダルビューを閉じる際に背後のナビゲーションコントローラーやタブバーコントローラーを操作する場合、 親ビューに通知を飛ばして画面遷移、タブ切換えの操作をしてもいいのですが、記述が分散したり、モーダルが複数のビューから呼ばれる可能性がある場合は途端に処理が煩雑になってきます。

こんなときは[self presentingViewController]を使って呼び出し側の操作をする事ができます。

背後にナビゲーションコントローラーがいる場合

    hogeViewController *hoge = [hogeViewController new];
    UINavigationController *nav = (UINavigationController *)[self presentingViewController];
    [nav pushViewController:hoge animated:YES];
    
    [self dismissViewControllerAnimated:YES completion:nil];

背後にタブバーコントローラーがいる場合

    UITabBarController* tab = (UITabBarController*)[self presentingViewController];
    [tab setSelectedIndex:1];
    
    [self dismissViewControllerAnimated:YES completion:nil];

これで、通知の記述やモーダルを呼び出し側の画面遷移のメソッド等を書かなくてもいいのですっきりとしましたね。

google Analytics3の基本的な設定方法

iPhoneアプリ申請直前にgoogle Analyticsを確認してみたら、
早くもver.3が出ていたので設置してみました。

SDKのダウンロードはこちら
基本的にはここの情報に従って設定を行います。

 

下準備

コピーするファイルは以下の通り

  • GAI.h
  • GAITracker.h
  • GAITrackedViewController.h
  • GAIDictionaryBuilder.h
  • GAIFields.h
  • GAILogger.h
  • libGoogleAnalyticsServices.a

Libraryフォルダから
libGoogleAnalytics_debug.aを抜いて
libGoogleAnalyticsServices.aを追加し、プロジェクトにコピーします。

f:id:cccookie:20131127211840j:plain

 

次に以下のFramework、libを追加します。
(上記の操作でlibGoogleAnalyticsServices.aは追加されているはず)

  • libGoogleAnalyticsServices.a
  • CoreData.framework
  • SystemConfiguration.framework
  • libz.dylib

 

イニシャライズ

AppDelegate.mで以下を記述

@interface AppDelegate(){
    id<gaitracker> tracker;
}
@end
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions{
    
	//googleAnalytics
	[GAI sharedInstance].trackUncaughtExceptions = YES;
	[GAI sharedInstance].dispatchInterval = 20;
	[[[GAI sharedInstance] logger] setLogLevel:kGAILogLevelVerbose];
	tracker = [[GAI sharedInstance] trackerWithTrackingId:@" UA-XXXX-Y"];

    return YES;
}

UA-XXXX-Yは各自でIDを取得して書き換えてください。
※trackerの行で不具合が出ていますね。
正しくは

tracker = [[GAI sharedInstance] trackerWithTrackingId:@" UA-XXXX-Y"];

 

画面を開いたポイントを計測

この計測には2通りのやり方があるようです。
1.自動計測

以下のように
GAITrackedViewController.hをインポートし
GAITrackedViewControllerを継承します

#import "GAITrackedViewController.h"

@interface HomeViewController : GAITrackedViewController

こうすることで、viewDidAppearなどに
 self.trackedViewName = @"About Screen";
と記述する事で計測ができます。

 

2.手動計測

GAI.h
GAIFields.h
GAIDictionaryBuilder.h

をインポートします。
毎回書くのが面倒であればxxxx-Prefix.pchに書いておきましょう。

    id tracker = [[GAI sharedInstance] defaultTracker];
	[tracker set:kGAIScreenName value:@"screen name"];
	[tracker send:[[GAIDictionaryBuilder createAppView] build]];

これで計測ができるはずです。

 

イベントの取得 

ボタンを押されたタイミング等で以下を記述します。
categoryとactionは必須のようです。

    id tracker = [[GAI sharedInstance] defaultTracker];
	
	[tracker send:[[GAIDictionaryBuilder createEventWithCategory:@"category"    // Event category (required)
														  action:@"action"  	// Event action (required)
														   label:@"label"       // Event label
														   value:nil] build]];  // Event value

 

これで、最低限の計測はできるはずです。

Xcode5 iOSシミュレーターのフォントの件

薄々気づいていたのですが、特に実害もなかったのでスルーしていました。
iOSシミュレーターのフォントが何か違う。微妙にダサい。

しかしながら、シミュレーターでスクショを撮る必要性に迫られ
ようやく重い腰を持ち上げて調査する事になりました。

 

f:id:cccookie:20131127004021p:plain

こちらは実機のスクショ

 

f:id:cccookie:20131127004047p:plain

iOS7 iPhone4/4sの実機がなくシミュレーターでスクショ撮り
コレジャナイ感満載のフォント

 

どうやら、これは中国語と認識されているようで、
言語を日本語にするとようやくきれいな表示に戻りました。
めでたしめでたし!

iOS7のステータスバーの電池アイコンの色

iOS7になってステータスバー周りの仕様が一部変更され、
バッテリー表示も緑色のアイコンになりました。

ところが、ふとした瞬間にバッテリーのアイコンを見ると、
アプリによっては白黒表示されている モノもある事に気付きました。

ステータスバーの色によっては緑色がマッチしない場合もあり、この表示を白黒に変更するやり方を必死で探したのですがどこにも見つからず、途方に暮れていた時に発見してしまいました。

 

給電されていない時は白黒表示になる!

 

というオチでした
なんでもっと早く気付かなかったんだorz..