ぎじゅつめもブログ

主にアプリ開発の技術メモを残していきます。

【Objective-C】UIScrollViewでスクロールに合わせたアニメーション

UIScrollViewを使うとき、スクロールに合わせてビューが消えたり、出現したりするアニメーションを表現したいときのメモです。
(環境:xcode5, iOS7)

スクロールビューをスクロールしたときに呼び出されるメソッド「- (void)scrollViewDidScroll:(UIScrollView *)scrollView」に実装します。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
    // スクロールしたときにページが変わるようにする
    CGFloat pageWidth = scrollView.frame.size.width;
    CGFloat contentWidth = scrollView.contentSize.width;
    CGFloat contentOffset = scrollView.contentOffset.x;
    if ((NSInteger)fmod(contentOffset, pageWidth) == 0) {
        pageControl.currentPage = contentOffset / pageWidth;
        currentPage = pageControl.currentPage;
    }
    // imageViewが最後のページのときだけ消えるようにする
    CGFloat baseOffset = (contentWidth - (pageWidth * 2.0));
    if (contentOffset >= baseOffset) {
        CGFloat delta = contentOffset - baseOffset;
        imageView.alpha = 1.0 - (delta / pageWidth);
    }
}

イメージビューのalpha値をスクロールに合わせて変えてるだけです。。

【Objective-C】UINavigationBarのタイトルを画像にする

UINavigationBarにUIImageViewを設定したいときのメモです。
(環境:xcode5, iOS7.1)

// タイトルに貼付けたいイメージ
UIImage* image = [UIImage imageNamed:imageName];

// イメージのサイズを調節
CGSize viewSize = CGSizeMake(image.size.width, image.size.height);
CGFloat imageHeight = 30;
CGSize titleImageSize = CGSizeMake(viewSize.width * (imageHeight / viewSize.height), imageHeight);

// UIImageViewをつくる
UIImageView* titleImageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, titleImageSize.width, imageHeight)];
titleImageView.backgroundColor = [UIColor clearColor];
titleImageView.image = [UIImage imageNamed:image];
[titleImageView setContentMode:UIViewContentModeScaleAspectFit];

// UIImageViewをのっけるUIViewをつくる
UIView* bgView = [[UIView alloc] initWithFrame:titleImageView.frame];
bgView.backgroundColor = [UIColor clearColor];
[bgView addSubview:titleImageView];

//UINavigationBarのタイトルに設定。selfはViewControllerです。
self.navigationItem.titleView = bgView;

ポイントはUIImageViewを一旦UIViewに追加してから、
そのUIViewをナビゲーションバーのタイトルへ設定していることです。
僕の場合、UIImageViewを直接「self.navigationItem.titleView」へ設定していたので、サイズが自動調整されてしまって、
navigationBarの両端にボタンを設定しているときタイトルが真ん中にいかなくて困っていました。

以上です。

【Objective-C】NSMutableArrayをソート

NSMutableArrayを並べ替えるときのメモです。

1. 文字列をキーにソートする場合

NSMutableArray* hogeMutableArray = /*データを設定*/;
NSArray* sortedArr = [NSArray array];
sortedArr = [[hogeMutableArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    HogeData* hoge1 = obj1;
    HogeData* hoge2 = obj2;
    NSStringCompareOptions compareOptions = (NSCaseInsensitiveSearch);
    return [hoge1.title compare:hoge2.title options:compareOptions];
    }] copy];
NSMutableArray* sorted = [sortedArr mutableCopy];

HogeDataオブジェクトがtitleプロパティを持っている想定です。
ここでは昇順で並べ替えをしています。降順の場合は、

[hoge1.title compare:hoge2.title options:compareOptions];

[hoge2.title compare:hoge1.title options:compareOptions];

にすればOKです。

2.integerをキーにソートする場合

NSMutableArray* hogeMutableArray = /*データを設定*/;
NSArray* sortedArr = [NSArray array];
sortedArr = [[hogeMutableArray sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
    HogeData* hoge1 = obj1;
    HogeData* hoge2 = obj2;
    if ( hoge1.orderbyRemoved > hoge2.orderbyRemoved ) {
        return (NSComparisonResult)NSOrderedAscending;
    } else if ( hoge1.orderbyRemoved < hoge2.orderbyRemoved ) {
        return (NSComparisonResult)NSOrderedDescending;
    } else {
        return (NSComparisonResult)NSOrderedSame;
    }
    }] copy];
NSMutableArray* sorted = [sortedArr mutableCopy];

以上です。

【Objective-C】AFNetworkingでBasic認証

AFNetworkingはHTTP通信するときにとても便利〜なライブラリですね。
AFNetworkingを使う際、Basic認証が求められるサイトと通信するときのメモです。

NSString* url = @"http://hogehoge.com";
AFHTTPRequestOperationManager *manager = [AFHTTPRequestOperationManager manager];
[manager setRequestSerializer:[AFHTTPRequestSerializer serializer]];
[manager.requestSerializer setAuthorizationHeaderFieldWithUsername:@"user" password:@"password"];
[manager GET:url
    parameters:nil
          success:^(AFHTTPRequestOperation *operation, id responseObject) {
             NSLog(@"%@", responseObject);
          }
          failure:^(AFHTTPRequestOperation *operation, NSError *error) {
             NSLog(@"Error: %@", error);
         }];

setRequestSerializerというメソッドを使ってBasic認証のIDとパスをセットしています。
以上です。

・参考記事
http://stackoverflow.com/questions/19102373/afnetworking-2-0-and-http-basic-authentication

【その他】DokuwikiにGoogleAdSenseの広告を表示する

GoogleAdSenseでDokuwikiに広告を表示させたいときのメモです。
(マニアックなネタですが。。日本語の情報がなかったのでメモしておきます。)

1. DokuwikiGoogle AdSense Plugin をダウンロード、インストール
(環境:CentoOS 6.3)

cd <dokuwikiのディレクトリ>/lib/plugins
wget http://cloud.github.com/downloads/tatewake/dokuwiki-plugin-googleads/googleads-stable.tar.gz
tar -xvzf googleads-stable.tar.gz
chown -Rv <ユーザー名> googleads/

解凍するだけでOKなんですね。

2. プラグインの公式サイトによると、dokuwikiディレクトリ/lib/plugins/googleads/admin.php が間違っているみたいなので修正
94行目の

print $this->plugin_locale_xhtml('intro');    //間違い

というところを

print $this->locale_xhtml('intro');   //正しい

にします。

3.dokuwikiディレクトリ/lib/tpl/<テンプレート>/main.phpを修正

<div class="stylehead">

    <div class="header">
      <div class="pagename">
        [[<?php tpl_link(wl($ID,'do=backlink'),tpl_pagetitle($ID,true),'title="'.$lang['btn_backlink'].'"')?>]]
      </div>
      <div class="logo">
        <?php tpl_link(wl(),$conf['title'],'name="dokuwiki__top" id="dokuwiki__top" accesskey="h" title="[H]"')?>
      </div>

というコードがあると思うので、その下に以下のコードを追記

<?php
    if (file_exists(DOKU_PLUGIN.'googleads/code.php')) include_once(DOKU_PLUGIN.'googleads/code.php');
    if (function_exists('gads_code')) gads_code('ads_tpl_top_linklist');
?>

4. Dokuwikiの管理画面でGoogle Adsenseの設定
・管理 > Google Adsense (正常に解凍が出来ていれば追加プラグインの下にリンクが出来ています) に移動
・Item Optionの欄に発行したGoogle AdSenseのコードを記入

<!– google_ads_section_start –>
~ここにGoogleAdSenseのコード~
<!– google_ads_section_end –>

以上です。

参考;
https://www.dokuwiki.org/plugin:googleads
http://www.systemengineers.de/plugins/google-adsense

【Objective-C】UIActivityIndicatorView (ぐるぐる回るやつ) の画像を変える

UIActivityIndicatorViewのイメージを変更するメモです。
(環境 : xcode 5.0.2, iOS7)

下記のライブラリを使えば簡単に出来ます。

https://github.com/cncool/CDActivityIndicatorView

プロジェクトに CDActivityIndicatorView フォルダごと突っ込んで、下記のように使います。
(サンプルプロジェクトのコピペ)

CDActivityIndicatorView * activityIndicatorView = [[CDActivityIndicatorView alloc] initWithImage:[UIImage imageNamed:@"custom_spinner.png"]];
    
activityIndicatorView.center = self.view.center;
    
[self.view addSubview:activityIndicatorView];
    
[activityIndicatorView startAnimating];

イメージ
f:id:tsuyushiga:20140227214329p:plain

簡単なのでおすすめです。

【cocos2d-x】Spineでスケルタルアニメーション作成 -イメージ切替-

前回(http://tsuyushiga.hatenablog.jp/entry/2014/02/16/214521)に引き続き、cocos2d-xで使うキャラクターの準備です。Spineを使ってアニメーションを作成しています。

今回はイメージを切り替えて、spineboyを瞬きさせたいと思います。

1. タイムラインからキームフレームを選択
f:id:tsuyushiga:20140217214911p:plain:w150

2. Hierarchyでイメージを複数登録しているスロットのツリーを開く
  サンプルでは eyes に eyes イメージと、eyes-closedイメージが登録されている。
f:id:tsuyushiga:20140217214927p:plain:w250

3. Hierarchyの目のマークの列に「●」をクリックすると、
  イメージの表示/非表示の切替が出来る。
  eyes-closedイメージが表示されるように設定。
f:id:tsuyushiga:20140217214933p:plain:w300

4. eyesスロットのキーマークの列の「●」をクリックして、
  変更を確定。
f:id:tsuyushiga:20140217214944p:plain:w300

5. キーフレームが設定された。
f:id:tsuyushiga:20140217214938p:plain:w150

同様にして、eyes-closedを再度非表示にして、
eyesを表示にすれば瞬きの完成です。
出来たものは以下です。(両腕も拡大されてしまっていますが。。)
f:id:tsuyushiga:20140217220054g:plain:w100

イメージ切替は以上です。