CocoaPodの練習ついでにSVProgressHUDを試してみる


ローディングマーク表示を楽にやりたかったんです。

遅まきながらCocoaPodsの恩恵にあやかりたいので導入して練習してみる。

既出ネタだけども、来週あたり使いそうなのでメモしておく。

* [生産性ガチアゲなオープンソースiOSライブラリ（終）：iOSライブラリ管理の神ツール「CocoaPods」のインストールと使い方 (1/2) - ＠IT](http://www.atmarkit.co.jp/ait/articles/1403/08/news008.html)

* [超簡単！iOSでたった数行でかっこいいローディング表示 – SVProgressHUD ｜ Developers.IO](http://dev.classmethod.jp/smartphone/ios-loading-svprogresshud/)


> SVProgressHUD | https://github.com/TransitApp/SVProgressHUD


```Podfile
platform :ios, "8.2"
pod 'SVProgressHUD'
```

これを書いたら
`$ pod install `
するだけでプロジェクトに追加とヘッダのサーチパスとかの設定とか諸々やってくれるこれは素晴らしい。

ローディングマークに加えてプログレス表示とかもできるようだったので、２パターン試してみたコードそのまま。


```objc:ViewController.m

#import "ViewController.h"
#import <SVProgressHUD.h>

#define PODTEST_LOADINGMARK

@interface ViewController ()
{
    BOOL    isLoadingShown;
    NSTimer *loadingTimer;
#ifdef PODTEST_LOADINGMARK
#else
    float progress;
#endif
}

-(IBAction)buttonPushed:(id)sender;
@end


@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    isLoadingShown = NO;

    [self resetTimer];
#ifdef PODTEST_LOADINGMARK
#else
    progress = 0.0f;
#endif
}

-(void)resetTimer {
    if (loadingTimer != nil) {
        [loadingTimer invalidate];
        loadingTimer = nil;
    }
}

-(void)onTimer:(NSTimer*)timer {
#ifdef PODTEST_LOADINGMARK
    isLoadingShown = NO;
    //    [SVProgressHUD dismiss];
    [SVProgressHUD showSuccessWithStatus:@"Time out"];
    [self resetTimer];
#else
    progress += 0.05;
    
    [SVProgressHUD showProgress:progress status:@"processing..."];
    if (progress >= 1.0) {
        isLoadingShown = NO;
//        [SVProgressHUD dismiss];
        [SVProgressHUD showSuccessWithStatus:@"Complete!"];
        progress = 0.0f;
        [self resetTimer];
    }
#endif
}


- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

-(IBAction)buttonPushed:(id)sender
{
    if (isLoadingShown) {
        isLoadingShown = NO;
        [self resetTimer];
        [SVProgressHUD dismiss];
#ifdef PODTEST_LOADINGMARK
#else
        progress = 0.0f;
#endif
    }
    else {
        isLoadingShown = YES;
#ifdef PODTEST_LOADINGMARK
        loadingTimer = [NSTimer scheduledTimerWithTimeInterval:3.0
                                                        target:self
                                                      selector:@selector(onTimer:)
                                                      userInfo:nil
                                                       repeats:NO];

        // マーク表示中は操作可
        [SVProgressHUD showWithStatus:@"Loading..."];
        
        // マーク表示中は操作不可（３パターン）
//        [SVProgressHUD showWithStatus:@"Loading..." maskType:SVProgressHUDMaskTypeClear];   // 消す時、dismissを合わせて呼ぶと、Successのメッセージ表示されないっぽい
//        [SVProgressHUD showWithStatus:@"Loading..." maskType:SVProgressHUDMaskTypeGradient];
//        [SVProgressHUD showWithStatus:@"Loading..." maskType:SVProgressHUDMaskTypeBlack];
#else
        loadingTimer = [NSTimer scheduledTimerWithTimeInterval:0.1
                                                        target:self
                                                      selector:@selector(onTimer:)
                                                      userInfo:nil
                                                       repeats:YES];
        [SVProgressHUD showProgress:progress];
#endif
    }
}

@end
```


＜追記＞
Progress表示にはNSTimerを使ったが、
ちょっと動きを試すとか、単純に一定時間カウントアップするだけなら、
`- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;`
を使えばよかった。
本家のDemoを見て使い方を知った次第。また一つ勉強になりました。
* [SVProgressHUD/ViewController.m at master · TransitApp/SVProgressHUD](https://github.com/TransitApp/SVProgressHUD/blob/master/Demo/Classes/ViewController.m)

見慣れた感じのローディングマークとしてはこちらもよさそう。
* [matej/MBProgressHUD](https://github.com/matej/MBProgressHUD)