Thursday, February 28, 2013

UILabelをコードで作成+NSTimer

UIViewの代表的なUILabelをプログラムから作成する方法と、タイマー処理を行うのに必要なNSTimerを紹介します

いつものように動画の後に、説明があります



<ViewController.mファイル>
1. まず最初に以下のコードでUILabelを作成します

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 300, 300, 30)];
    label.text = @"sample sentence";
    label.backgroundColor = [UIColor greenColor];
    label.font = [UIFont systemFontOfSize:17];
    label.numberOfLines = 3;
CGRectについてはこちら->CGRectのリファレンス(日本語です)
UILabelについてはこちら->UILabelのリファレンス(日本語です。紹介しきれなかったプロパティも載ってます)

2. 作成したUILabelをviewに以下のプログラムで追加します
[self.view addSubview: label];

これでUIViewにはプログラムで作成したUILabelが追加されました。
次はタイマー処理です

<タイマー処理>

タイマー処理は簡単で、以下のコードを加えるだけです
NSTimerについてはこちら->NSTimerのリファレンス(日本語です)

    NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:2.0 target:self selector:@selector(showLabel:) userInfo:nil repeats:YES];

これだけで、指定した時間ごと、もしくは指定した時間後にselectorで指定したメソッドを実行してくれます

以上がプログラムからUILabelを追加する方法とNSTimerの紹介でした

Wednesday, February 27, 2013

プログラムからセグエを実行する

セグエで画面を移動したいけど、移動する前に何か処理をしたいというときありますよね?
そんなときに役立つコードからセグエを実行する方法を紹介します。

いつものように動画の後に、説明文です。




<Interface Builder>
1. 送りたい画面へstory boardからセグエを結びつけます
2. 1で作ったセグエにidentifierに適当な名前をいれます(動画を見ていただけるとわかりやすいと思います)

<mファイル(送る側)>
3. セグエを実行したいタイミングで以下のコードを書きます

[self performSegueWithIdentifier: @"your segue id" sender: self];

以上で実行されます
以下は今回のタイトルとは無関係ですが、セグエを実行すると同時にpropertyもセットしたいときにどうすればいいのかの紹介です(動画でも紹介しています)

<送った先のview controllerのpropertyをセットしたいとき>
1. セグエで到達する側のview controller.hファイルをセグエを実行するmファイルでimportします
2. 以下のプログラムを書きます
-(void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{
    if([segue.identifier isEqualToString:@"your segue id"]){
        secondViewController *third = segue.destinationViewController;
        third.a = 3;
    }
}

*3行目でsecondViewControllerの変数を作っていますが、ここは自分の移動したいViewControllerに変更してください
*4行目の".a"はaがpropertyの変数名になります。なので、sampleというproperty変数を持っているときは、".sample"と書くことでその変数の値を決められます。

以上がプログラムからセグエを実行する方法の紹介でした!

進捗状況1

まだまだやることは山積みですが、すこしだけ今の状況を確認しておこうと思います




<やらなきゃいけないこと>

  1. メッセージが重なっている状況の解決
  2. データベースの勉強。MySQLはかなり使ったので効率化などを考えなければ使えるレベルまではすぐに到達すると考えています。ドットインストールで勉強する予定です
  3. アラームの仕方。NSLocalNotificationを使うということはわかっております
  4. 音楽のダウンロードの仕方。(優先順位は今のところ低いです。サーバーなど用意する必要があるため)
こんな状況です。静的でもLINEのようなメッセージが表示することができて嬉しかったです

Friday, February 22, 2013

UITabBarからモーダルぽく新しいviewを表示する

UITabbarControllerからセグエで表示されるように新しいviewを表示する方法です。
動画の下のテキストは動画の内容を文字に書き起こしたものになります。
動画でわからなかったところの補足として使ってください



<状況>
UITabbarControllerで新しいviewを下のボタン群を消してモーダルぽくエフェクトをつけて表示したい。
−− UINavigationControllerも一緒に使っている場合プロパティがあるのですが、UITabbarControllerだけだと、使えないので別の方法を考える必要があります

 <解決策>
presentViewControllerを使う

では、見ていきましょう

1. 表示させたいviewにstoryboard IDをつける。view controllerを選択した状態で左から3番目のちっちゃいアイコンで確認できます。(わからなかったら動画を見てください)
2.表示したいタイミングで以下のコードを書けばOK

     UIViewController *modal = [[self storyboard]instantiateViewControllerWithIdentifier:@"setProfile"];
    [self presentViewController:modal
                       animated:YES
                     completion:NULL];

*上のサンプルでsetProfileとなっているところは自分でつけたstoryboardのidに置き換えてください
*このままだと、表示方法がdefaultの下から競り上がるエフェクトになっていますが、modal.modalTransitionStyleで指定できます

以下が動画で追加したプログラムです

サンプルコード(表示させる側のmファイル)
    modal = [[self storyboard]instantiateViewControllerWithIdentifier:@"show"]; //このmodalはhファイルで宣言されたUIViewControllerの変数です
    modal.modalTransitionStyle = UIModalTransitionStyleCrossDissolve;
    [self presentViewController:modal
                       animated:YES
                     completion:NULL];

サンプルコード(表示させたい側のmファイル)
    [super dismissViewControllerAnimated:YES completion:NULL];

Thursday, February 21, 2013

UabBarControllerでUIScrollviewを使う

UITabBarControllerでUIScrollViewがうまく使えなくてかなり悩んだので紹介します。
テキストは動画で何をしているかを文字で書きました。動画の補足として使ってください
また、最後に動画で追加したプログラムを載せているので、画質が悪くてよくわからない場合に使ってください




<状況>
--普通のUIViewContorllerを使うappだとscroll viewがうまく動く。
--でも、Tabbar controllerでscroll viewを埋め込むと、frameの設定も効かないし、contentSizeも反映されない

<原因>
--iPhone SDK6.0のauto layoutが原因です

<解決策>
--公式ドキュメントを見て頑張ってみる。
公式ドキュメントはこちら→http://developer.apple.com/library/ios/#releasenotes/General/RN-iOSSDK-6_0/index.html
ずっとスクロールしていき、コードが貼り付けられているところがuiscrollviewの解決策になります

では、さっそく見ていきましょう

1.スクロールさせたい範囲にuiscrollviewを配置し、それをhファイルにつなげます。
デリゲートを使いたい人はそれも配置します。
ここでは、scrollという名前にしました。以下でself.scrollと出てきたらUIScrollViewのことだなと思ってください

2.translatesAutoresizingMaskIntoConstraintsをNOに設定します
self.scroll.translatesAutoresizingMaskIntoConstraints = NO;

3. UIViewを新しく作り、UIViewのframeとself.scrollのcontentsizeの大きさをそろえます。
ここでは、contentWidthとcontentHeightという変数をframeのサイズを指定するのに使っています。
変数の値は自分のしたいことに合わせて変えましょう
UIView *contentView = [[UIView alloc] initWithFrame:CGRectMake(0,0,contentWidth,contentHeight)];
[scrollView addSubview:contentView];

4.self.scrollのcontentSizeをcontentViewのサイズに合わせます
[scrollView setContentSize:CGMakeSize(contentWidth,contentHeight)];

5.自分がscrollviewに表示したいものをどんどん、contentViewにaddSubviewしていき、最後にcontentViewをself.scrollにaddSubviewすれば完成です。
[self.scroll addSubview:contentView];

以下がサンプルです

どのファイルを編集しているのかがわかりづらいのですが、コメントの部分などを手がかりにして、自分のプロジェクトと対応させてください^^;

以下が動画で追加したプログラムになります
    self.scroll.translatesAutoresizingMaskIntoConstraints = NO;
    UIView *contenView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 320, 700)];
    self.scroll.contentSize = CGSizeMake(320, 700);
    
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, 300, 100, 30)];
    label.text = @"300";
    [contenView addSubview:label];
    
    UILabel *label1 = [[UILabel alloc]initWithFrame:CGRectMake(0, 400, 100, 30)];
    label1.text = @"400";
    [contenView addSubview:label1];

    UILabel *label2 = [[UILabel alloc]initWithFrame:CGRectMake(0, 500, 100, 30)];
    label2.text = @"500";
    [contenView addSubview:label2];
    
    [self.scroll addSubview:contenView];