井原プロダクトのBLOG

Since 2013。個人でアプリ作っています。

iPhone動画カメラアプリは、撮ったファイルが自動で消えない

今作ってる動画カメラアプリですが、iTUNES Connectで申請まで終わって、やれやれ、ということで自分のiPhoneにローカルインストールして使っていたら、ストレージがいっぱいになったぞゴルァ!と怒られてしまいました。んなこたーないだろう!?とiPhoneのストレージ使用状況を見ると、何と私のカメラアプリが、数ギガにまで膨れ上がってるじゃないか!?ということで早速調べてみた。

このアプリは、明示的に「保存」しない限り、写真フォルダーに動画を保存しないつくりなのですが、それでも一時ファイルがどんどん残ってしまいます。なので消さないといけなかったのね。早速、申請を取り下げて修正をすることに。

//インスタンス変数として宣言
NSString *pathToVideo;

//録画が終わったら起動されるメソッド
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {
    NSURL *videoURL  = [info valueForKey:UIImagePickerControllerMediaURL];
    pathToVideo = [videoURL path];
    _videoURL = pathToVideo;
    //PickerControllerを閉じる
    [self dismissViewControllerAnimated:YES completion:nil];
    
//   取った画像の再生
    NSURL *url = [info valueForKey:UIImagePickerControllerMediaURL];
    playerItem = [[AVPlayerItem alloc] initWithURL:url];
    [playerItem addObserver:self forKeyPath:@"status" options:0 context:&ItemStatusContext];
    [[NSNotificationCenter defaultCenter]
     addObserver:self
     selector:@selector(playerItemDidReachEnd:)
     name:AVPlayerItemDidPlayToEndTimeNotification
     object:playerItem];
    player = [AVPlayer playerWithPlayerItem:playerItem];
    [playerView setPlayer:player];
    //再生開始
    [player play];
}


//必要なタイミングでこのメソッドを呼び出す
-(void) deleteFile
    {
    //ここで録画したファイルを消す
    NSFileManager *fileManager = [NSFileManager defaultManager];
    if ([fileManager fileExistsAtPath:pathToVideo]) {
        NSError *error;
        // Attempt to delete the folder containing globalDel.videoPath
        
        if ([fileManager removeItemAtPath:[pathToVideo stringByDeletingLastPathComponent] error:&error] != YES)
        {
            NSLog(@"Unable to delete file: %@", [error localizedDescription]);
        }else{
            NSLog (@"消去成功");
        }
    } else {
        NSLog (@"消去失敗");
        
    }
}

アプリ開発用にディスプレイを新調

x-codeを使ってアプリ開発していますが、今までの開発環境はRatinaになる前の13インチのMBPと、BENQの15.6インチの外付けディスプレイでした。これだと手狭なので、拡張することにしました。

iiyama 23インチ、XUB2390HS-B1 1968 X 1080 ピクセル

これでx-codeを使うとどうなるかというと、こんな感じ。至って快適。マルチスクリーンで、MBP側をメール、ネット検索、素材編集とかの作業画面にして、プログラミングは大画面側で。今までが1366X768なので、ピクセルの数でいうと約2倍になったわけです。


これだと、アシスタントエディタを開いた状態でも、ガンガンコードが書けますね。今日1日作業してみて、良い点と悪い点を。

良い点:
・これが一番の目的で9割を占めるのだけど、でかい。同時に色々な作業ができる
・反射が少ないので、非常に目が楽
・モニタから離れても(70cmくらい)コードが見える(私、強制視力0.9)。これは、モニタを見るために特定の姿勢を維持しなくて良いということになります。椅子の背もたれによっかかってコードが書ける。非常に楽、腰にも優しい。
・高さ調整ができるため、サブ画面との接地位置調整が可能。
・価格も23K弱というのは安い

残念だった点:
・パネルがもうちょっと低い位置まで下がると嬉しい。
・パネルを縦に回転する仕組みがあるのだが、この機能のせいで横に使っていても水平がずれやすい。水平ってちょっとずれるだけで気になるんですよ。なので水平箇所でカチっと止まると嬉しい。
・スピーカーがついているのだが、音はしょぼい、実にしょぼい。

Thunderbold-HDMI変換ケーブルでつないでいます。

尚、HDMI接続すると、自動的に音声出力もHDMI側に出力されて、MACのヘッドホン端子から音が出なくなります。これを直すには、システム環境設定=>サウンドで、「出力」タブを選んでサウンドを出力する装置を選択から「ヘッドホン」を選びます。

MBPと外付けという使い方の場合、キーボード&マウスも外付けをお勧めします。左右に並べた状態でMBPのキーボードを使うと首が疲れますので。

というわけで、もっと早く導入すればよかった。

何でクラッシュするの?

iPhoneアプリ、バージョンUPしたものがAPPストアでReady for saleになった。
早速喜んでDLして起動したら、、、 |)゚0゚(| ホェー!!


起動直後にクラッシュ!!


もちろん開発環境では問題なく動いてる。何でだよ!? 急いでAPPLEにはメールしたけど、こういう場合何かできることってあるのかなぁ。

アプリ第2弾リリースしました。

絵を壁に飾ったらどうなるか?をシミュレーションできるアプリです。個人的に個人事業立ち上げについて色々アドバイスを頂いてお世話になっているクラーベルさん向け。

https://itunes.apple.com/jp/app/bini-huiwo-kuraberu/id901931669?mt=8&ign-mpt=uo%3D4


まだまだObjective-Cの勉強中なので、習作といった感じなのですが、自分の備忘録として記録しておくと今回このアプリで習得した技術は以下。

1) UIImagePickerContorollerによるカメラ、写真フォルダーの表示
2) 画像サイズの調整 (カメラで撮った画像は大きすぎる)
3) 複数Viewを貼ったときの、各Viewの管理と制御 (NSMutableArrayに保存)
4) Toolbarによる画面切り替え
5) Toolbarのアイコンのカスタマイズ
6) 縦/横の切り替え(これが一番苦労した)
7) 画像合成、保存
8) Scrollbarによる画像拡大、縮小
9) ブラウザ表示
10) collectionViewの使い方
11) textデータの保存、読み出し
12) AutoLayoutとか、そうじゃないときとか

特に3)については、今回画面上に複数の額絵を貼り付けられるようにしたため、ScrollViewで拡大されたときに全部一度に拡大しないといけない、とか、どれか一つを削除したいとか、そのあたり工夫しました。

具体的には、SubViewを増やす際、以下の様にNSMutableArrayにどんどんViewの情報を保存しています。

NSMutableArray *selectedPictureList;

//インスタンス作成
UIImageView *pictureView = [[UIImageView alloc] init];
pictureView = [[UIImageView alloc]initWithFrame:rect];
pictureView.image = image;
pictureView.contentMode = UIViewContentModeScaleAspectFit;
pictureView.tag = button.tag;
[_wallView addSubview:pictureView];
float x = pictureView.center.x;
float y = pictureView.center.y;
//Listに記録
[selectedPictureList addObject:@[@(button.tag), pictureView,@(x),@(y),@(width),@(height)]];

どのViewが選ばれたかというのは、eventが発生したときにsenderやgestureRecognizeにviewが入っていますので、それと比較してselectedPicutreListのpictureViewとどれかと一致しているかを検索します。こうしてpictuerViewを保存しておくと、UIImageViewはポインタ変数なので、selectedPicureList上でx,y,width,heightを変化させれば、実際のViewが変わるわけですね。

これによって、縦横の表示変更などに対応しています。

https://itunes.apple.com/jp/app/bini-huiwo-kuraberu/id901931669?mt=8&ign-mpt=uo%3D4

これぞメトロノーム革命、練習革命!

iPhone用のメトロノームアプリをリリースしました。その名もスマートメトロノーム

メトロノームアプリは沢山ありますが、スマートメトロノームは世界初の機能を持っています。

1) 再生テンポをプログラミングできる
2) テンポは0.5の刻み

1) については、小節数を指定してそこを何度も練習するときに、段々速くすることができます。また、曲の途中でリタルダンドアチェレランドがある様な場合も対応可能。今まで機械的に一定のテンポしか刻めなかったメトロノームが、まるで指揮者の様に練習テンポを指示します。

2) は、現代音楽において63.5などの指定がある曲がありますが、今までその様なテンポを刻めるメトロノームは無く演奏家を苦しめてきました。

楽器の練習において大切な事は2つあると思います。

1. できない所を練習しよう
2. できない所はゆっくり練習しよう

楽器演奏は楽しいです。楽しいが故に、出来ない部分の完成度を上げるよりも、つい楽器演奏を楽しんでしまいます。その結果、数時間練習しているのに、できない部分はできないまま。一体今日一日で何が上達したんだろう?などと言う事が起きてしまいます。

特に子どもの練習を見ていると感じると思いますが、必ず最初から弾いて同じところで間違えて、それでも最後まで弾きます。そしてまた最初から弾き始めて同じところで間違えて、、、の繰り返し。つっかえる所だけ10回練習すれば遥かに効果的なのに。

そして、できない部分は、できるテンポまで落とす必要があります。何が問題で弾けないのか、もっと簡単な弾き方はないのか?それらを探るには、絶対に間違えないテンポまで落として指や体の最適な使い方を確認し、徐々にテンポを上げて行くしかありません。できもしないテンポで100回繰り返しても、間違った動きを体に覚えさせることになってしまいます。

このメトロノームには、以下の機能があります。

1. 練習する小節数を決められる
2. 繰り返し回数を決められる
3. 繰り返し毎に段々早くできる

これにより、できない部分を集中的により効率的に練習する事が可能になります。言ってみれば、うしろに常に先生がついていてくれて「はい、そこもう一回!」と言ってくれるようなものです。自分の好きな部分ばっかり演奏してしまうことはありません。

私自身、このメトロノームを使う事によって、練習時間が遥かに短縮されている事を実感しています。無料でリリースしていますので、ぜひ使ってみてください。

https://itunes.apple.com/jp/app/smart-metronome/id889571826?mt=8

UIToolBar これじゃ動かない 惜しい!



/*
//
//
// toolbarにキレイなアイコンと文字を表示させる方法
//
//


//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image = [UIImage imageNamed:@"win.png"];


//UIButtonを作成する
UIButton *vi = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label.text = @"写真を撮る";
label.textColor = [UIColor darkGrayColor];
label.font = [UIFont systemFontOfSize:10];
label.backgroundColor = [UIColor clearColor];
[vi addSubview:label];
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithCustomView:vi];
button.width = 50;

//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image1 = [UIImage imageNamed:@"win.png"];

//UIButtonを作成する
UIButton *vi1 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image1 forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label1.text = @"写真を選ぶ";
label1.textColor = [UIColor darkGrayColor];
label1.font = [UIFont systemFontOfSize:10];
label1.backgroundColor = [UIColor clearColor];
[vi addSubview:label1];
UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithCustomView:vi1];
button1.width = 50;


//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image2 = [UIImage imageNamed:@"win.png"];

//UIButtonを作成する
UIButton *vi2 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image2 forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label2.text = @"サイズ調整";
label2.textColor = [UIColor darkGrayColor];
label2.font = [UIFont systemFontOfSize:10];
label2.backgroundColor = [UIColor clearColor];
[vi addSubview:label2];
UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:vi2];

//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image3 = [UIImage imageNamed:@"win.png"];

//UIButtonを作成する
UIButton *vi3 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image3 forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label3 = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label3.text = @"絵を選ぶ";
label3.textColor = [UIColor darkGrayColor];
label3.font = [UIFont systemFontOfSize:10];
label3.backgroundColor = [UIColor clearColor];
[vi addSubview:label3];
UIBarButtonItem *button3 = [[UIBarButtonItem alloc] initWithCustomView:vi3];


*/



/*
//
//
// toolbarにキレイなアイコンと文字を表示させる方法
//
//


//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image = [UIImage imageNamed:@"win.png"];


//UIButtonを作成する
UIButton *vi = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label.text = @"写真を撮る";
label.textColor = [UIColor darkGrayColor];
label.font = [UIFont systemFontOfSize:10];
label.backgroundColor = [UIColor clearColor];
[vi addSubview:label];
UIBarButtonItem *button = [[UIBarButtonItem alloc] initWithCustomView:vi];
button.width = 50;

//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image1 = [UIImage imageNamed:@"win.png"];

//UIButtonを作成する
UIButton *vi1 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image1 forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label1 = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label1.text = @"写真を選ぶ";
label1.textColor = [UIColor darkGrayColor];
label1.font = [UIFont systemFontOfSize:10];
label1.backgroundColor = [UIColor clearColor];
[vi addSubview:label1];
UIBarButtonItem *button1 = [[UIBarButtonItem alloc] initWithCustomView:vi1];
button1.width = 50;


//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image2 = [UIImage imageNamed:@"win.png"];

//UIButtonを作成する
UIButton *vi2 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image2 forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label2 = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label2.text = @"サイズ調整";
label2.textColor = [UIColor darkGrayColor];
label2.font = [UIFont systemFontOfSize:10];
label2.backgroundColor = [UIColor clearColor];
[vi addSubview:label2];
UIBarButtonItem *button2 = [[UIBarButtonItem alloc] initWithCustomView:vi2];

//画像を選ぶ(元は300X300くらいで良い。背景を透明にすること。jpgはダメ)
UIImage *image3 = [UIImage imageNamed:@"win.png"];

//UIButtonを作成する
UIButton *vi3 = [[UIButton alloc] initWithFrame:CGRectMake(0, 0, 50, 35)];
[vi setBackgroundImage:image3 forState:UIControlStateNormal];
[vi addTarget:self action:@selector(onTapTest:) forControlEvents:UIControlEventTouchUpInside];

//ラベルを作成する (センタリングの方法が良くわからないので、CGRectMakeにて左右位置を調整している
UILabel *label3 = [[UILabel alloc] initWithFrame:CGRectMake(2, 0, 50, 65)];
label3.text = @"絵を選ぶ";
label3.textColor = [UIColor darkGrayColor];
label3.font = [UIFont systemFontOfSize:10];
label3.backgroundColor = [UIColor clearColor];
[vi addSubview:label3];
UIBarButtonItem *button3 = [[UIBarButtonItem alloc] initWithCustomView:vi3];


*/

iPhoneアプリ「超」入門

絶対に挫折しない iPhoneアプリ開発「超」入門【iOS6対応版】

絶対に挫折しない iPhoneアプリ開発「超」入門【iOS6対応版】

これ終了。

X-Codeの使い方
クラス、インスタンス、メソッド、プロパティとは
Cの復習
UITool KIT
地図、カメラアプリなどの作成
Developer登録とiPhoneへのインストール
Objective-Cについては全く足りない
デバッグ方法も記載ない