Hatena::ブログ(Diary)

Over&Out その後 このページをアンテナに追加 RSSフィード Twitter

2012-08-28

iAd + nend の切り替え表示ラッパークラスを公開しました

最近は個人で出す無料アプリはもっぱら

  • メインは iAd
  • iAdの広告在庫がないときに nend

という iAd + nend の併用パターンが多くなりました。


で、iAd / nend の実装方法を調べたりとか、切り替え処理を実装したりとか面倒なので、1行で済むラッパークラスをつくりました。


こんな感じで、表示したいUIViewControllerサブクラスに 1行書くだけで iAd + nend の切り替え表示を実現できます

[[AdBannerManager sharedInstance] showAdBannerForRootViewCtr:self posY:430];

個人アプリ『i聖徳太子』や『余命電卓』でも使用してます。

(というか個人で出してる全ての無料アプリで使用してます)


f:id:shu223:20120828081516p:image:w240



詳しい使用手順

前準備: iAd と nend の準備
  • iTunes Connect で、Enable iAds する
  • nend の管理画面で広告枠を追加し、API KEY と SLOT IDをコピーしておく
  • nend SDKをプロジェクトに追加
  • iAd.framework と Security.framework をプロジェクトに追加

前準備:AdBannerManager の準備
  • AdBannerManager をプロジェクトに追加
  • {プロジェクト名}-Prefix.pchに、下記を定義。(xxxxとなっているところは手順2で nend 管理画面からコピってきたものを使う)
#define kNendAPIKey @"xxxxxxxxxxxxxxxxx"
#define kNendSpotID @"xxxxx"

バナー表示
  • 広告を表示する UIViewController サブクラスで、ヘッダインポート
#import "AdBannerManager.h"

  • 表示したいところ(例えばviewWillAppear:)で showAdBannerForRootViewCtr:posY: をコール
[[AdBannerManager sharedInstance] showAdBannerForRootViewCtr:self posY:430];

※ posY 引数にはバナーの origin の y 座標を指定します。

(たとえば430を指定すれば、バナーの frame は {0, 50, 320, 50} になります。)



ダウンロードはこちらから

gumroad にて $1 で販売しております。


http://gum.co/aROh


【注意点】

  • 横向き対応/ユニバーサル対応はしていません
  • iOS 5.x のみで動作確認しております
  • コードのみの販売です。サポート等はご容赦ください。

#この記事を書いた当初は強気の $5 だったのですが、数時間経っても売れる気配がないので $1 にしてみました。




2012-08-27

Cocoa Controls の掲載審査に関する諸々

8/27に届いた Cocoa Controls のメルマガで気付いたのですが、"UIKitForGames" が Cocoa Controls に掲載されたようです。


http://www.cocoacontrols.com/platforms/ios/controls/uikitforgame


で、今回やってみてわかったこと諸々を書いておきます。


ページ自体はすぐ生成される

Submit a Control のページから、必要項目を入力して "Create Control" ボタンを押せば、ページ自体はすぐに生成されます。


このページには誰でもアクセスできるので、自分のブログにリンクを貼付けるといった使い方では問題ないです。


が、この状態ではまだ Controls のページに掲載されません。


つまり、アクセスされるのは URL を知っている人からのみになります。


掲載には審査がある

Submit a Control のページの一番上に、こう書いてあります。

Fill in this form to submit your control, but please note that Cocoa Controls is a curated collection and low-quality controls will be rejected.


審査があり、リジェクトもあるとのことです。


審査まではかなり待たされる

審査に完了していないコントロールは、そのページの上部に "This controls isn't publicshed yet." 云々といったメッセージが出てきます。


あまりにこの状態が長いので、「審査を受けるには何か手続きが必要なのか?」と不安になったりもしましたが、ただ待つだけのようです。


約3週間ぐらいで審査通過しましたが、特に通過の連絡のようなものはありませんでした


掲載されるメリット

何が嬉しいって、外国の方々から star をもらえるようになること!


Cocoa Controls はグローバルに利用されているサービスなので、そこの浅い階層のページやメルマガにキャプチャつきで掲載されると、Githubページに海外からもアクセスされるようになります。


英語がそんなに得意ではなくて、海外への発信力ゼロな自分としてはこれがありがたすぎます




以上です。


まだ1つしかsubmitしたことがないので、どれぐらいのものであればリジェクトされるのか、リジェクトされたらページにアクセスできなくなるのか、といったことはわかりませんが、とにかく時間がかかることだけはわかったので、出したいものはさっさとsubmitした方が良さげです。



2012-08-06

ゲームアプリ向け UI コンポーネントセット "UIKitForGame" を公開しました

最近はゲームアプリをつくることが多いのですが、その中で自分でもよく使う UIKit のカテゴリ/サブクラスの詰め合わせを Github にアップしました。


https://github.com/shu223/UIKitForGame


以下に概要と使い方を紹介させていただきます。



DamageValueLabel

某ファイナルなファンタジーのバトルを彷彿とさせるダメージ値のアニメーションが簡単に行えるようになる UILabel のサブクラスです。


f:id:shu223:20120805161332p:image:w240


手軽にゲームっぽい雰囲気を出せるので、モック等によく使っています。


使い方

表示したい文字列を UILabel の text プロパティにセットし、

[self.label startAnimation];

このように startAnimation メソッドをコールするだけ!


More
self.damageLabel.textColor = [UIColor redColor];

このように UILabel に元からある textColor プロパティで色を変更すればそれも反映されますし、フォント(とフォントサイズ)も UILabel の font プロパティからの変更が反映されるようになっています。



UIImageView+effects

UIImageView にセットされた画像を白く光らせるエフェクトです。内部で動的に白く塗りつぶした画像を生成しています。


自分はデモにあるようにダメージを受けたときや、登場シーンなどによく用いています。


使い方

whiteFadeInWithDuration:delay:block: メソッドをコールするだけです。

[self.charaImgView whiteFadeInWithDuration:0.3
                                     delay:0.0
                                     block:^(void) {
                                     	 // エフェクト完了後の処理
                                     }];

注意点など

動的に画像を生成しているので、対象となる画像のサイズが大きい場合や、パフォーマンスが要求される場合などには不向きかもしれません。


自分はそういったケースでは本カテゴリをそのまま用いず、生成した画像をキャッシュして再利用したり、元からそういう素材を用意しておいたりしています。


More

UIImageView+effects から UIImage+fill という自作カテゴリをインポートしているのですが、こちらもなかなか便利かもしれません。


UIImageView+effects からは UIImage+fill カテゴリの次のメソッドを使っています。

- (UIImage *)imageFilledWhite;

画像を白く塗りつぶした UIImage を生成するメソッドです。


他に、下記のようなメソッドを持っていて、

- (UIImage *)imageFilledWithColor:(UIColor *)color;

引数に指定した任意の色で塗りつぶした UIImage を生成することができます。


f:id:shu223:20120806133635p:image



UIView+shake

ダメージを与えた/受けたときなどに、グラグラと揺らすエフェクトです。


UIView のカテゴリとして実装してあるので、UIImageView で表示している画像を揺らす、コンテナビューごと揺らす、等幅広く使用することができます。


使い方

shakeWithCount:interval:をコールします。

    [self.charaImgView shakeWithCount:10 interval:0.03];

引数には揺らす回数、揺れの早さを指定します。



サンプル

UIKitForGameDemo プロジェクトで上記の機能が一通り試せますので、ビルドして実行してみてください。


f:id:shu223:20120805162106p:image:w240



今後の更新予定

今はまだ3つしかありませんが、自分でよく使い回しているクラスやカテゴリはまだまだあるので、ソースが整い次第、随時追加していきたいと思っております。


また実装のイケてない部分などあると思いますが、pull request いただければ反映させていただきます!



2012-08-05

Cocoa Controls で見つけたティッカー4種を比較してみました

ティッカーというのは、(本当の定義はわかりませんが)文字が流れるアレです。


文字を横方向に流すアニメーションをするだけのことですが、たとえばパズドラのティッカーを見てると、表示開始時は右から一気に左端まで移動させ、そのあとゆっくり左方向に流す、ということをやっていて、ティッカーと一口にいっても色々と表現方法がありそうです。


この辺り、いちいちつくるのは面倒なので、使い回しやすい感じで誰か作ってくれてそうだと思い、Cocoa Controls で検索してみました。


そんなわけで見つけたティッカーOSS 4つを比較してみました。



CLTickerView

シンプルなデモが入っています。


f:id:shu223:20120805144656p:image:w240


CLTickerView.hを見てみると、

@property (nonatomic, retain) CLScrollview *scrollview;
@property (nonatomic, retain) NSString *marqueeStr;
@property (nonatomic, retain) UIFont *marqueeFont;

- (CGSize)labelSizeForText:(NSString *)text forFont:(UIFont *)font;

APIはこれだけ。


で、デモのソースを見てみると、

CLTickerView *ticker = [[CLTickerView alloc] initWithFrame:CGRectMake(0, 20, 320, 30)];
ticker.marqueeStr = @"This is a sample ios marquee using scrollview and timer. You can also manually control it by scroling left or right, or touch on it to stop it, and release it to auto restart the marquee.";
ticker.marqueeFont = [UIFont boldSystemFontOfSize:16];

[self.view addSubview:ticker];
[ticker release];

ティッカーに対してやっていることはこれだけ。

アニメーションをスタートさせるとか、開始地点とかは自動のようです。(CLTickerView.m を見ると、drawRect でアニメーション開始してました)


https://github.com/caydenliew/CLTickerView



JHTickerView

アニメーション開始と停止ボタンのあるデモが入っています。


f:id:shu223:20120805144810p:image:w240


ヘッダをみると

@property(nonatomic, retain) NSArray *tickerStrings;
@property(nonatomic) float tickerSpeed;
@property(nonatomic) BOOL loops;
@property(nonatomic) JHTickerDirection direction;

-(void)start;
-(void)pause;
-(void)resume;

とあって、開始、停止、再開の他、方向を変えたり、スピードを調整したり、複数の表示文字列を配列で指定したりできるようです。


https://github.com/jeffhodnett/JHTickerView



MKTickerView

株式市場情報が流れるデモ。


f:id:shu223:20120805144952p:image:w480


MKTickerView の API は

@property (nonatomic, assign) IBOutlet id <MKTickerViewDataSource> dataSource;

-(void) reloadData;
-(void) startAnimation;

このようにデータソースを指定する仕組みになっていて、

MKTickerViewDataSource の定義は、

|@protocol MKTickerViewDataSource <NSObject>
@required
- (UIColor*) backgroundColorForTickerView:(MKTickerView*) tickerView;
- (int) numberOfItemsForTickerView:(MKTickerView*) tickerView;

- (NSString*) tickerView:(MKTickerView*) tickerView titleForItemAtIndex:(NSUInteger) index;
- (NSString*) tickerView:(MKTickerView*) tickerView valueForItemAtIndex:(NSUInteger) index;
- (UIImage*) tickerView:(MKTickerView*) tickerView imageForItemAtIndex:(NSUInteger) index;
@end
|<
こんな感じになってます。


ひとつひとつの表示アイテムは MKTickerItemView オブジェクトになっていて、<span class="deco" style="font-weight:bold;">タイトル、詳細、画像を指定</span>できます。
>|objc|
@interface MKTickerItemView : UIView {
  
  NSString *_title;
  NSString *_value;
  UIImage *_image;
}

- (void) setTitle:(NSString *) title value:(NSString*) value image:(UIImage*) image;

https://github.com/MugunthKumar/MKTickerViewDemo



DMScrollingTicker

タイトル、詳細が流れ、ポーズとレジュームボタンがあるデモが入っています。


f:id:shu223:20120805145118p:image:w240


ヘッダは長いので一部だけ紹介すると、

- (void) beginAnimationWithLazyViews:(LPScrollingTickerLazyLoadingHandler) dataSource
                          itemsSizes:(NSArray *) subviewsSizes
                           direction:(LPScrollingDirection) scrollDirection
                               speed:(CGFloat) scrollSpeed
                               loops:(NSUInteger) loops
                        completition:(LPScrollingTickerAnimationCompletition) completition;

このように UIView の blocks アニメーション形式で諸々のパラメータや終了後の処理を指定できたり、


- (void) scrollToOffset:(CGPoint) offsetPoint animate:(BOOL) animated;
- (void) scrollToStart:(BOOL) animated;

このようにオフセットを操作するAPIもあったりして、なかなか使い勝手と自由度のバランスが良さげです。


https://github.com/malcommac/DMScrollingTicker



まとめ

用途にもよると思いますが、導入の簡単さと、汎用性のバランスが良いのは DMScrollingTicker かなと感じました。

それか、もっとシンプルでよければ、JHTickerView か。


CLTickerView はできることが少なすぎ、MKTickerView はDataSourceプロトコルの実装が面倒、と感じました。


今回はデモを動かしてざっとヘッダを眺めただけの比較なので、実際に使ってみると実装が怪しかったりとかあるかもしれません。



2012-08-04

$(SRCROOT) や $(BUILD_DIR) 等の Xcode で使用しているマクロの置換内容の一覧を調べる方法

Info.plistや、ビルド設定をいじっていると、こんな文字列に出くわすかと思います。


  • $(PRODUCT_NAME)
  • $(TARGET_TEMP_DIR)
  • $(SRCROOT)

これらはそれぞれ特別な意味を持ち、Xcode がビルド時だか何だかのタイミングでプロダクト名とか環境に応じたパスとかに置き換えたりしてくれるものです。




が、



「SRCROOTってどこだっけ?プロジェクト直下?それともその一つ下?」

「Library Search Path を指定したいけどこの場所を指定するのにどのマクロを使っていいかわからない」



みたいなことになることが度々あるのではないでしょうか?(僕はあります)


そして困ったことに、これらを網羅したAppleのドキュメントもありません

(※というのは間違いで、バッチリありました。末尾の追記をご参照ください)



最近やっとその「Xcode で使用しているマクロの置換内容の一覧を見る方法」を見つけたので、ご紹介させていただきます。



方法

env > env.txt

Run Scriptに登録してビルド実行



これだけです。



ビルド実行すると、プロジェクトフォルダに env.txt というファイルが生成され、

PRODUCT_NAME=xxxxxx

TEMP_FILES_DIR=/Users/xxxx/Library/Developer/Xcode/DerivedData/xxxxx/Build/Intermediates/xxxx.build/Debug-iphoneos/xxxx.build

SRCROOT=/Users/xxxx/xxx/xxxx/xxxx

みたいな感じでズラズラとマクロ名とその置換内容の一覧が出力されます。




ちなみに、Run Script にスクリプトを登録する方法がよくわからない方は、

"xcode run script build phase"

あたりのキーワードでググってみるときっとわかりやすい解説記事が見つかるのではないかと思います。


キャプチャがないとよくわからないかもしれませんが、簡単に手順を書くと、

  1. Build Phases タブを開く
  2. 右下にあるAdd Build Phase ボタン押下
  3. Add Run Script を選択
  4. スクリプト記入欄があるのでスクリプトをコピペ

こんな感じです。




参考ページ




追記

この記事を公開して5分後ぐらいに@azu_re様よりツイートいただきました。

http://bit.ly/Mq3kkv とかに大体まとまってた気がする


おっしゃる通り大体まとまってました。。



「まとまったドキュメントはない」というのは間違いだったわけですが、この記事に書いた env でやる方法使うと自分の環境での path がわかるので、これはこれでアリかなと思っております。


azu_re様、情報ありがとうございました!



2009 | 08 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2012 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2013 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2014 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2015 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2016 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 11 | 12 |
2017 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2018 | 02 |