iOSアプリ開発の逆引き辞典

iPhone/iPadで使えるアプリ開発のTipsをまとめてみました

NSStringクラスのdrawInRect:withFont:lineBreakMode:alignment:メソッドをワーニングが出ないように書き換える

NSStringクラスのdrawInRect:withFont:lineBreakMode:alignment:メソッドは、iOS 7.0から「deprecated(非推奨)」となり、下図のようなワーニング表示されるようになりました。

f:id:ch3cooh393:20140327181840p:plain

横に長いため全文表示ができていませんが、下記のようなワーニングが表示されています。

'drawInRect:withFont:lineBreakMode:alignment:' is deprecated: first deprecated in iOS 7.0 - Use -drawInRect:withAttributes:

つまり、既存のdrawInRect:withFont:lineBreakMode:alignment:メソッドを使用することはiOS 7.0からは非推奨なので、drawInRect:withAttributes:メソッドを使うようにしましょう、ということです。

さて、以下のサンプルコードをiOS 7.0向けにdrawInRect:withAttributes:メソッドを使うように変更してみましょう。

iOS 7.0までの文字列描画

// フォントオブジェクトを生成する
UIFont *font = [UIFont boldSystemFontOfSize:11.0];

// 文字は白色で描画する
[[UIColor whiteColor] set];
    
// text を描画する
[text drawInRect:CGRectMake(0, 0, 320, 50) 
        withFont:font
   lineBreakMode:NSLineBreakByClipping
       alignment:NSTextAlignmentCenter];

iOS 7.0からの文字列描画

// フォントオブジェクトを生成する
UIFont *font = [UIFont boldSystemFontOfSize:11.0];

// パラグラフで文字の描画位置などを指定する
NSMutableParagraphStyle *style = [[NSMutableParagraphStyle alloc] init];
style.lineBreakMode = NSLineBreakByWordWrapping;
style.alignment = NSTextAlignmentCenter;

// text の描画する際の設定(属性)を指定する
NSDictionary *attributes = @{
    NSForegroundColorAttributeName : [UIColor whiteColor],
    NSFontAttributeName : font,
    NSParagraphStyleAttributeName : style
};

// text を描画する
[text drawInRect:CGRectMake(0, 0, 320, 50) withAttributes:attributes];

UISegmentedControl(セグメンテッドコントロール)の見た目をカスタマイズする

UISegmentedControl(セグメンテッドコントロール)は、いくつかの項目に分割されたボタンを管理するクラスです。

UISegmentedControlを単純に配置した場合、iOS 7.0以降では下図のように表示されます。

f:id:ch3cooh393:20140325154955p:plain

本記事では、セグメンテッドコントロールをカスタマイズしてみましょう。

セグメンテッドコントロールの項目のタイトルを変更する

// 項目のタイトルを変更する
[self.segmentedControl setTitle:@"カスタマイズ" forSegmentAtIndex:0];

f:id:ch3cooh393:20140325160824p:plain

2番目の項目が選択された状態にする

    // 2番目の項目が選択された状態にする
    self.segmentedControl.selectedSegmentIndex = 1;

f:id:ch3cooh393:20140325160938p:plain

セグメンテッドコントロールの色を変える

// セグメンテッドコントロールの色を変える
self.segmentedControl.tintColor = [UIColor purpleColor];

f:id:ch3cooh393:20140325154902p:plain

セグメンテッドコントロールの「選択されている項目」のタイトル色を変更する

    // セグメンテッドコントロールの選択されているタイトルの色を変更する
    NSDictionary *attributes = @{
        NSForegroundColorAttributeName : [UIColor greenColor]
    };
    [self.segmentedControl setTitleTextAttributes:attributes
                                forState:UIControlStateSelected];

f:id:ch3cooh393:20140325155402p:plain

セグメンテッドコントロールの「選択されていていない項目」のタイトル色を変更する

    // セグメンテッドコントロールの選択されていないタイトルの色を変更する
    NSDictionary *attributes = @{
        NSForegroundColorAttributeName : [UIColor brownColor]
    };
    [self.segmentedControl setTitleTextAttributes:attributes
                                  forState:UIControlStateNormal];

f:id:ch3cooh393:20140325155454p:plain

Google Analytics SDK for iOS v3に対応する(バージョン2からの移行)

今までGoogle Analytics SDK for iOS v2を使っていましたが、2014年2月よりiOSアプリのx64対応が必要となり、最新版のSDKであるGoogle Analytics SDK for iOS v3を使う必要が出てきました。

Google Analytics SDKのアップデートは基本的にはファイルの差し替えだけで済みますが、今回メジャーバージョンが上がっていることもあり、画面(ビュー)やイベントをトラッキングするコードも変更しないといけないようです。

ヘッダーの追加

#import "GAITracker.h"
#import "GAIFields.h"
#import "GAIDictionaryBuilder.h"

デバック出力をしない

    // デバック出力はしない
    [GAI sharedInstance].debug = NO;

    // デバック出力はしない
    [[GAI sharedInstance].logger setLogLevel:kGAILogLevelVerbose];

通信にはHTTPSを使用する

    // 通信にはHTTPSを使用する
    [[GAI sharedInstance].defaultTracker setUseHttps:YES];

    // 通信にはHTTPSを使用する
    [[GAI sharedInstance].defaultTracker set:kGAIUseSecure value:[@NO stringValue]];

画面(ビュー)のトラッキング

    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    [tracker sendView:screenName];

    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    [tracker sendView:screenName];

    GAIDictionaryBuilder *builder = [GAIDictionaryBuilder createAppView];
    [tracker send:[[builder set:screenName forKey:kGAIScreenName] build]];

イベントのトラッキング

    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    [tracker sendEventWithCategory:[GAnalyticsHelper categoryName:category]
                        withAction:actionName
                         withLabel:labelName
                         withValue:value];

    id<GAITracker> tracker = [[GAI sharedInstance] defaultTracker];
    GAIDictionaryBuilder *builder
        = [GAIDictionaryBuilder createEventWithCategory:categoryName
                                                  action:actionName
                                                   label:labelName
                                                   value:value];
    [tracker send:[builder build]];

クラス名からそのクラスの持っているプロパティの一覧を取得する

クラス名からそのクラスの持っているプロパティの一覧を取得する方法をご紹介します。ログ出力に便利になると思います。

#import <objc/runtime.h>

// クラス名からプロパティリストを生成する
id lenderClass = objc_getClass([className UTF8String]);
unsigned int propertyCount = 0;
objc_property_t* propertyList = class_copyPropertyList(lenderClass, &propertyCount);

NSMutableArray* propList = [[[NSMutableArray alloc] init] autorelease];
for (int i = 0; i < propertyCount; i++) {
    objc_property_t* property = propertyList + i;
    NSString* propertyName = [NSString stringWithCString:property_getName(*property) encoding:NSASCIIStringEncoding];
    NSLog(@"propertyName: %@", propertyName);
}
free(propertyList);