2014年5月31日土曜日

【Objective-C】iPhoneの書式設定に応じて日付表記を変える方法

日本の書式の場合
 2014年5月31日土曜日
アメリカの書式の場合
 Saturday, May 31, 2014

NSDateFormatterのsetDateStyle、setTimeStyleの指定を変える事によって、上記書式以外にも変換出来ます。

    NSDate          *date = [NSDate date];
    NSDateFormatter *df  = [[NSDateFormatter alloc]init];
    [df setLocale:[NSLocale currentLocale]];
    [df setDateStyle:NSDateFormatterFullStyle];
    [df setTimeStyle:NSDateFormatterNoStyle];

    self.labelDate.text = [df stringFromDate:date];


【Objective-C】TableCellに追加してオブジェクト種類を調べる方法

このソース例ではTableCellに追加したボタンをTableのEditモードかどうか判定して、表示したり、非表示したりする処理です。
Cellに乗っかっているオブジェクトをFor文でまわし、isMenberOfClassでUIButtonかどうか判定して処理を実装する。

- (void) cellEditMode:(BOOL) isEdit{
    NSArray * visibleCells = [self.tableView visibleCells];
    
    for (UITableViewCell *cell in visibleCells){
        for (UIControl *object in [cell.contentView subviews]) {
            if([object isMemberOfClass:[UIButton class]]){
                object.hidden = isEdit;
            }else{
                object.enabled = isEdit;
            }
        }
    }

}

【Objective-C】toolBarに動的にボタンを追加する方法

StoryBoard上でtoolBarを追加します。下記のメソッドを実行して動的にボタンを追加できます。self.toolbarItems = nilでtoolBarのアイテムをすべて削除しています。ボタン間に均等に間隔を空けるためFlexibleSpaceを設定します。




- (void) createToolBarItemEdit{
    NSString *btnStr;
    
    self.navigationController.toolbarHidden = NO;
    self.toolbarItems = nil;
    
    UIBarButtonItem *flexibleItem = [[UIBarButtonItem alloc]
                                     initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace
                                     target:nil
                                     action:nil];
    
    //左のボタン
    if([self isLocaleJapanese]){btnStr = @"すべて選択";}else{btnStr = @"Mark All";}
    UIBarButtonItem * barButtonLeft = [[UIBarButtonItem alloc]
                                       initWithTitle:btnStr
                                       style:UIBarButtonItemStyleBordered
                                       target:self
                                       action:@selector(btnMarkAll:)
                                       ];

    //中のボタン
    UIBarButtonItem * barButtonCenter = [[UIBarButtonItem alloc]
                                         initWithBarButtonSystemItem:(UIBarButtonSystemItemAdd)
                                         target:self action:@selector(btnAdd:)
                                         ];
    
    //右のボタン
    if([self isLocaleJapanese]){btnStr = @"ゴミ箱";}else{btnStr = @"Trash";}
    UIBarButtonItem * barButtonRight = [[UIBarButtonItem alloc]
                                        initWithTitle:btnStr
                                        style:UIBarButtonItemStyleBordered
                                        target:self
                                        action:@selector(btnTrash:)
                                        ];
    
    self.toolbarItems = @[barButtonLeft ,flexibleItem ,barButtonCenter,flexibleItem ,barButtonRight];
    

}




【Objective-C】iPhoneに設定されている言語が日本語かどうか判定する方法


-(BOOL)isLocaleJa{
    //まず言語のリストを取得します。
    NSArray *languages = [NSLocale preferredLanguages];
    // 取得したリストの0番目に、現在選択されている言語の言語コード(日本語なら”ja”)が格納されるので、NSStringに格納します。
    NSString *languageID = [languages objectAtIndex:0];
    
    // 日本語の場合はYESを返す
    if ([languageID isEqualToString:@"ja"]) {
        return YES;
    }
    
    // 日本語の以外はNO
    return NO;

}

2014年5月28日水曜日

Totalworkout - muscle building app

Totalworkout - muscle building app.
It is an iPhone application which carries out muscle training record.
Please use those who are training the body in the house or the gym.
The past record can be searched from a training part or exercise, or old growth record can also be displayed by a line graph.
Usage is also simple and it does not worry about operation.
We support your body remodeling through application.

iTunes

Youtube

It is training notebook application.
・ Record of the weight training.
・ Addition and editing of the exercise.
・ Making of the routine that put exercise together.
・ Reference of past exercise.
・ Search of past exercise.
・ The choice of the language, Japanese and English.


2014年5月10日土曜日

【Objective-C】UIActivityIndicatorViewを使用してインジケータを表示する方法

画面表示時に重たい処理をメインスレッドで実施すると、端末がフリーズしたように感じてしまいます。一般ユーザーは画面が表示された瞬間にスクロールやタップを開始するので、数秒間の処理でもフリーズしたと思われてしまいます。
これを回避するにはGCD(rand central dispatch)というマルチスレッドプログラミングを実装します。簡単にいうと、『メインスレッドには重たい処理は書かない、重たい処理は非同期の別スレッドに書く』ということです。今回はバックグラウンドでの重たい処理を実行中にインジケータを表示しています。

では、インジケータのサンプルプログラムを説明します。

まずはヘッダーファイルに、GCDで使用するキューと、インジケータを定義します。

■ヘッダーファイル
dispatch_queue_t _main_queue;
dispatch_queue_t _sub_queue;
UIActivityIndicatorView *_indicator;

Viewのロードイベントでインジケータを設定します。
スタート(開始)するにはstartAnimatingメソッドを使用します、ストップ(停止)するにはstopIndicatorメソッドを使用します。
インジケータに_indicator.hidesWhenStopped = YESを設定しているので、ストップ時に自動的に非表示になるようです。

サンプルプログラムの流れは下記のようになります。
メイン処理
 ・インジケータのスタート
  ▶︎画面にくるくるが表示される

 バックグラウンド処理
  ・通信、集計などの重たい処理
  ・インジケータのストップ(メインスレッドでやる)

ポイントはインジケータのスタート、ストップともにメインスレッドで実装する必要がああるということ。ストップはバックグラウンドの重たい処理が終わったら実施する必要があります。サンプルではperformSelectorOnMainThreadを使用してバックグラウンドからメインスレッドで実施するように書いています。

動作の流れとしてはインジケータがスタートし、バックグラウンドに処理を投げて、画面を表示する。その際に画面上にはくるくるとインジケータが表示されて見える。また、メインスレッドで処理は動いていないため、ユーザーは画面を動かす事もできます。この間バックグラウンドで、画面に表示するためのデータを作成し、作成完了後にバックグラウンド処理からインジケータのストップ処理をメインスレッドで実施するようにしています。

よくあるインジケータが表示されませんという話は、
メイン処理に
・インジケータのスタート
・通信、集計などの重たい処理
・インジケータのストップ
と書いているからです。
このような書き方では、画面にインジケータは表示されません。
上記3つの処理が終わった結果が表示されるだけです。また、メインスレッドでの処理中は画面操作が出来ません。よって、フリーズしているように感じとられてしまいます。


■ソースファイル
- (void)viewDidLoad
{
    [super viewDidLoad];

    // UIActivityIndicatorViewのインスタンス化
    CGRect rect = CGRectMake(0, 0, 100, 100);
    _indicator = [[UIActivityIndicatorView alloc]initWithFrame:rect];
 
    // 位置を指定
    _indicator.center = self.view.center;
 
    // アクティビティインジケータのスタイルをセット
    _indicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
 
    _indicator.hidesWhenStopped = YES;
 
    // UIActivityIndicatorViewのインスタンスをビューに追加
    [self.view addSubview:_indicator];
}

// テーブルデータ作成
- (void) createTableData{
    // メインスレッド用で処理を実行するキューを定義するする
    _main_queue = dispatch_get_main_queue();
    // サブスレッドで実行するキューを定義する
    _sub_queue = dispatch_queue_create("tableLoad", 0);

    // くるくるを表示する
    [_indicator startAnimating];
 
    // サブキュー実行
    dispatch_async(_sub_queue, ^{
        //重たい処理を実装する

        //インジケータ消す
        [self performSelectorOnMainThread:@selector(stopIndicator) withObject:nil waitUntilDone:NO];
        [self.tableView performSelectorOnMainThread:@selector(reloadData) withObject:nil waitUntilDone:NO];
     
        // メインキュー実行
        dispatch_async(_main_queue, ^ {


        });
    });  
}

【つぶやき】TotalWorkOut筋トレ記録、筋トレ管理アプリのプロモーション動画

iPhone向け、筋トレ記録、筋トレ管理アプリのプロモーション動画を作成してみました。
次のVersionでは筋トレ成長曲線を見れるようにグラフに対応していきます。

2014.05.28
成長曲線グラフに対応済み。

【Objective-C】UIImageView上のイメージ画像(UIImageView)をダブルタップして拡大・縮小する方法

ジェスチャーを登録し、タップ時に呼ばれるイベントメソッドをセレクタに指定します。
ダブルタップの判定として、numberOfTapsRequired = 2とします。
メソッド側にてscrooViewのサイズを変更させます。

- (void)viewDidLoad
{
    [super viewDidLoad];
   
    UITapGestureRecognizer *doubleTap =
    [[UITapGestureRecognizer alloc] initWithTarget:self
                                            action:@selector(doubleTap:)];
    doubleTap.numberOfTapsRequired = 2;
    [self.view addGestureRecognizer:doubleTap];
}


- (void)doubleTap:(UITapGestureRecognizer *)recognizer {
    CGPoint location = [recognizer locationInView:[recognizer.view superview]];
   
    CGRect zoomRect;
    if (self.scrollView.zoomScale > 1.0) {
        zoomRect = self.scrollView.bounds;
    } else {
        zoomRect = [self zoomRectForScrollView:self.scrollView
                                        withScale:2.0
                                    withCenter:location];
    }
    [self.scrollView zoomToRect:zoomRect animated:YES];
}

【Objective-C】UIImageView上のイメージ画像(UIImageView)をピンチして拡大・縮小する方法

UIScrollViewの上にUIImageViewを追加する。
ヘッダーファイルにUIScrollViewのデリゲートを設定する。
ソースファイルでUIScrollViewの拡大率の設定して、デリゲートメソッドを定義する。これだけで、イメージ画像の拡大、縮小が可能です。

■ヘッダー
@interface ViewControllerPhoto : UIViewController<UIScrollViewDelegate>
{
}
@property (weak, nonatomic) IBOutlet UIImageView *imageView;
@property (weak, nonatomic) IBOutlet UIScrollView *scrollView;
@end

■ソース
- (void)viewDidLoad
{
    [super viewDidLoad];

    self.scrollView.minimumZoomScale = 1.0f;
    self.scrollView.maximumZoomScale = 3.0f;
    self.scrollView.delegate = self;

}

- (UIView *)viewForZoomingInScrollView:(UIScrollView *)scrollView {
    return self.imageView;
}

2014年5月9日金曜日

【App Store】ExifPlusをリリース

■概要
https://itunes.apple.com/us/app/exifplus/id871141035?l=ja&ls=1&mt=8

iPhoneに保存されている写真のExif情報が確認できます。
使い方
1.アルバムを選択
 ・Exif情報を確認したいアルバムを選択します。

2.写真の選択
 ・一覧から写真をExifデータを確認したい写真を選択します。

3.Exif確認
 ・撮影した場所が地図から確認できます。
 ・Exif情報が確認できます。

2014年5月4日日曜日

【Apple】ついに日本でもiTunes Matchのサービスが開始されたそうです

アメリカでは2年前くらいから始まっているサービスですが、日本でもついに開始されました。『iTunes Match』とはそもそも何でしょうか簡単に説明します。
自分のパソコンに保存している楽曲ファイル(購入していないくてもいい)をインターネット経由でiPhoneから聴けるというサービスです。iPhone、iPad、iPodなど自分が所有(AppleID同一)するものであればデバイスは問いません。ただし、年間3980円という利用料が発生します。

このサービスのメリットを説明します。
・iPhone、iPodで持ち歩けなかった音楽ファイルがいつでも聴ける。
・音楽ファイルをパソコンに保存する必要はなくなる。

かなり大きいメリットだと思います.iPhoneの使用容量の大半が音楽で占めている人、iPhoneに入りきらずにパソコンと繋いで毎回同期している人、パソコンのhdd容量が少ない人。個人的にはこのサービスのおかげで、iPhoneは16GBの容量で済んでいます。

以下、簡単に仕組みを説明しておきます。
お手持ちの音楽ファイルと、AppleのiTunes Storeにある音楽ファイルをマッチングする。ここで曲名がマッチングすれば、Appleからダウンロードの権利が与えられる。これにより自分の所有する端末であればいつでもどこでも自由に聴けるということになるようです。すべての音楽ファイルは256Kbps AAC、DRMフリーの音質で聴けます。(お手持ちの音楽ファイルの質が悪くても)
※ iTunes Storeには3,700万曲以上あるらしい(2014/5/4時点)

では、マッチングしない場合はどうなるのか。その場合は、お手持ちの音楽ファイルをiCloudにアップロードすることになります。これによりマッチングと同様にサービスが受けられます。
注意点もいろいろあるので、公式から抜粋しておきました。

□Apple公式のHPより(2014/5/4時点)
iTunes Match で利用できるのは、最大 25,000 曲です。
iTunes Match と同じ Apple ID を使って iTunes Store で購入した曲は、25,000 曲の制限にはカウントされません。
マッチしなかったコンテンツはアップロードされますが、アップロードの所要時間はデータ量やローカルネットワークの速度によって異なります。
200 MB を超える曲ファイルは iCloud にアップロードされません。
2 時間を超える曲ファイルは iCloud にアップロードされません。
デジタル著作権管理 (DRM) で保護されている曲は、お使いのコンピュータでそのコンテンツを再生できる場合を除き、マッチせず、iCloud にもアップロードされません。

【App Store】Checker Plusリリースしました。

Todo、チェックリストにつかえるアプリケーションです。

■ リスト
買うもの
 ┠ あああ ✔️
 ┗ いいい ✔️

持ち物(5/5)
 ┠ レジャーシート ✔️
 ┗ かばん

中間テストの目標
 ┠  国語80点以上 ✔️
 ┗  数学80点以上

使い方は自由です。いろいろな用途に使えます。
代表例『忘れ物、飲み会などの出欠確認、イベント毎の参加管理、自分の目標管理』


下記ファイルの様に、リスト(見出し)を追加します。ここでは『買うもの』として追加しています。『買うもの』に対して、さらにリストを追加します。ここでは『肉・・・』と追加してチェックする事が可能です。また、リストの内容について、メールを送信することができます。『チェックなし、チェックあり』でメール本文が自動生成されます。

上記はシンプルな使い方です。もう少し高度に使うには、『テンプレート機能』を使います。この機能は毎回使う内容を『リスト(見出し)、リスト(見出しの内容)』をあらかじめ登録しておく事が可能です。下記に『地域のスポートクラブ管理者として当アプリを使用する』場合のテンプレート例。
■  リスト
サッカークラブ1年生
 ┠ あああ
 ┠ いいい
 ┗ ううう

サッカークラブ2年生
 ┠ かかか
 ┠ ききき
 ┗ くくく

このようにあらかじめ登録しておくことにより、新規リストを毎回作成する必要はなくなります。例えば5、6月に試合がある場合、テンプレートからリストを選択することができます。この時にチェックリストの見出しは登録したテンプレート名が自動で表示されるので、わかりやすい名前に変更することをお勧めします。

■ テンプレートから追加したリスト
サッカークラブ1年生 ▶︎ サッカー5月試合1年生
のようにリスト名を変更します。

リストの内容はサッカークラブメンバーが自動で設定されるので、あとは、参加可否のチェックとして使う事ができます。その参加可否の結果はメール送信ができるので、まわりの関係者たちとすばやく共有することができます。

メンバーが増えた場合も対応出来ます。テンプレートを編集することができるので、該当テンプレートを選択したうえ、新しいメンバーを追加していきます。
※削除、変更も同様の操作でできます。