Saturday, October 5, 2013

UIButtonをプログラムから作成する

このようなフラットデザインのボタンを作れるライブラリを使いながらボタンを作成したのでめもめも
QBFlatDesignについてはこちらのgithubプロジェクトを見ていただければわかるので、ここでは触れません。

では、ボタンをプログラムから作る方法と、クリックイベントの取得の方法をばここに。
    QBFlatButton *bottomButton = [[QBFlatButton alloc]initWithFrame: CGRectMake(20, frame.size.height - 80, frame.size.width - 40, 60)];
    // デフォルトのボタンを作るときは以下のコード
     UIButton *bottomButton = [UIButton buttonWithType:UIButtonTypeRoundedRect]; // この場合あとでフレームを指定しないと行けない
    // font
    bottomButton.titleLabel.font = [UIFont boldSystemFontOfSize: 20];
    [bottomButton setTitle:@"Mark" forState:UIControlStateNormal];
    [bottomButton setTitleColor:[UIColor whiteColor] forState:UIControlStateNormal];
    // color
    bottomButton.faceColor = [UIColor colorWithRed:0.23 green:0.83 blue:.51 alpha:1];
    bottomButton.sideColor = [UIColor colorWithRed:.16 green:.76 blue:.44 alpha:1];
    // event
    [bottomButton addTarget:self action:@selector(bottomButtonTapped) forControlEvents:UIControlEventTouchUpInside];

    [self.view addSubview:bottomButton];

Friday, October 4, 2013

Xcodeでアニメーションさせる

何かをアニメーションさせながら非表示にしたいということはよくあると思う。
そんなときに使えるのがこのメソッド
- (void)viewDidLoad
{
    [super viewDidLoad];

     CGRect frame = self.view.bounds;

    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake(0, frame.size.height - 100, frame.size.width, 100)];
    label.backgroundColor = [UIColor colorWithWhite:1 alpha:0.8];
    [self.view addSubview:label];

    [UIView animateWithDuration:0.5 animations:^{
        label.frame = CGRectMake(0, frame.size.height - 100, frame.size.width, 100);
    }];
}
このコードを動かすと、画面が表示されてから0.5秒掛けながら、画面の下から100px分表示されていた透明なバーが下に下がっていく。

おためしあれ〜〜

UIScrollViewでどれくらいはやく動いているかを取得する

UIScrollVIewでどれだけ動いたかを知りたくて、その方法を探していた。
UIScrollViewに限らず、UITableViewでも使える。

- (void)scrollViewDidScroll:(UIScrollView *)scrollView;
{
    CGPoint velocity = [[scrollView panGestureRecognizer] velocityInView:self];
    if (abs(velocity.y) >= 800) {
        // do something
    }
}
これでvelocityの速度を違うメソッドに渡せば、Google+のiPhoneアプリのように、スクロールに合わせて表示、非表示の切り替えを行うことが出来る。

カレンダーライブラリ~MNCalendarView~

カレンダーアプリを作ろうと思い立ち、TapkuLibraryを使用できるようになったのはいいがそれでは僕がイメージしていたものができたいとわかったため、違うライブラリを探していた。

試していったのを順次使い方を含めて紹介していく。

MNCalendarView

非常に簡単に使用でき、なおデザインも最高にいい。

<手順>
こちらのGitHubプロジェクトから自分のパソコンへファイルを移動させる。形式はzipでも、gitでもなんでもいい。
そして、プロジェクトにMNCalendarViewをAdd Fileするだけ。とても簡単だ。以下のコードで画像のようなカレンダーが表示される。
// viewController.h
#import 
#import "MNCalendarView.h"

@interface ViewController : UIViewController

@end

// viewController.m
#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
/*
    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    [formatter setDateFormat:@"yyyy-MM-dd"];
    NSString *dateString = @"2013-09-08";
    NSDate *date = [formatter dateFromString:dateString];
    これで始めの位置を指定しようとしたがかなわなかった。
*/
    MNCalendarView *calendar = [[MNCalendarView alloc]initWithFrame:self.view.bounds];
    calendar.selectedDate = date;
    [self.view addSubview:calendar];
}

- (void)didReceiveMemoryWarning {
    // 省略
}

@end

これでこのように表示される

デザインもシンプルでいいのだが、日付をタップされたときのイベントの取得がデフォルトでなく、また、カレンダーを表示させる位置も終わらせる位置もデフォルトでなかったので、ボツに

そこでTimesSquareを採用したのだが、これも長くなりそうなのでまた今度のエントリーにまとめます

TapkuLibraryのカレンダーで日付のタップイベントを取得する!

前回の記事で無事カレンダーを表示させるところまでいけたので、今回はカレンダーの日付をタップされたときのイベント取得を実装します。
前回の記事→TapkuLibraryのedgesForExtendedLayoutで悩んでいるすべての方へ


// viewController.h
// ここは前回の記事と変わらない。delegateが増えていることに注目
#import 
#import "TapkuLibrary/TapkuLibrary.h"

@interface ViewController : UIViewController 

@end

// viewController.m
#import "ViewController.h"

@interface ViewController () {
    TKCalendarMonthView *calendar;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    calendar = [[TKCalendarMonthView alloc]init];
    calendar.delegate = self;
    // calendar.dataSource = self;  * タップイベントを取得するだけだったらこれは必要ありません。
    [self.view addSubview:calendar];
}

- (void)didReceiveMemoryWarning {
// 省略
}

// カレンダーがタップされたイベントを取得
- (void)calendarMonthView:(TKCalendarMonthView *)monthView didSelectDate:(NSDate *)date {
    NSLog(@"tapped!!");
}

@end


TapkuLibraryのedgesForExtendedLayoutで悩んでいるすべての方へ

TapkuLibrary。。。すばらしいライブラリですよね。
デフォルトぽいカレンダーが数行で書けてしまいます。(僕はまだ表示させるところまでいっていない)

そんなTapkuLibraryですが、最近のiOS 7へのアップデートの影響でビルドが通らないことがあります。
その解決策です。

問題その1: "Property edgesForExtendedLayout not found on object"

ご心配には及びません。このエラーはすぐに解決できます。


まずこのエラーの原因ですが、iOS 7では存在するこのプロパティがiOS 6では存在しないことにより起きております。
証拠資料→UIViewController Class Reference


なので、「edgesForExtendedLayout」と書かれている行はすべてコメントアウトしてもかまいません。
本当はOSが7以上だったらで実行させたいところですが、xcodeをアップデートしないとこの行ではエラーがでるようになっているため、コメントアウトしか方法はありません。
iOS7かどうかを判別するif文はこちらのリンクをどうぞ
Writing iOS7 code that compiles against iOS 6 Base SDK

問題その2: "vImageBoxConvolve_ARGB8888"

これが問題になることもあります。「ARGB_8888」で検索してコメントアウトさせましょう。


無事、ビルドが通ればカレンダー表示!

問題なくビルドが通るようになったらいよいよviewにカレンダーを表示させます。


// viewController.h
#import 
#import "TapkuLibrary/TapkuLibrary.h"

@interface ViewController : UIViewController 

@end

// viewController.m
#import "ViewController.h"

@interface ViewController () {
    TKCalendarMonthView *calendar;
}

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    
    calendar = [[TKCalendarMonthView alloc]init];
    [self.view addSubview:calendar];
}

- (void)didReceiveMemoryWarning {
//省略
}

@end


これだけでなんとすばらしいカレンダーが表示されてしまいます!
このように!

おためしあれ〜〜

xcode4で.xcdatamodeldファイルを作成

いつもhファイルとmファイルを加えるように「File -> New -> File」と選択していく。
そうするとこのようなダイアログウィンドーがでてくるから、
上の画像の通り、OS XのCore Dataを選択し、
上の画像の通りを加える。

そのあとに作成するxcdatamodeldのファイル名を決めなくてはならないが、最初はデファルとのModel.xcdatamodeldで問題ない。