Sunday, October 6, 2013

Magical Recordの使い方

やっとMagical Recordが使えるようになったのでメモしておく。
Personというエンティティ名をサンプルとして使用する。
こんな感じのデータ構造になっております。

Person
--name
--age

Insert

[MagicalRecord setupCoreDataStack];

Person *person = [Person MR_createEntity];
person.name = @"Sato Taro";
person.age = [NSNumber numberWithInt: 19];
これだけで新しいPersonを作成することが出来る。

Select

 
[MagicalRecord setupCoreDataStack];
NSArray *persons = [Person MR_findAllWithPredicate:[NSPredicate predicateWithFormat:@"(name == '%@')", @"Sato Taro"]];
これが単純なセレクト
ANDでつなぐ場合
[MagicalRecord setupCoreDataStack];
Person *person = [Person MR_findFirstWithPredicate:[NSPredicate predicateWithFormat:@"(name == 'Sato Taro') AND (age == 19)"]];
SORTしたいとき
[MagicalRecord setupCoreDataStack];
NSArray *persons = [Persn MR_findAllSortedBy:@"age" ascending:YES];
ほかにもっと複雑なセレクトを書けたいときは順次加えていく。

Update

[MagicalRecord setupCoreDataStack];
Person *person = [Person MR_findFirstWithPredicate: [NSPredicatepredicateWithFormat:@"name = 'Sato Taro'"]];
person.name = @"Sato Kogoro";
これだけ!

Delete

[MagicalRecord setupCoreDataStack];
Person *person = [Person MR_findFirstWithPredicate: [NSPredicatepredicateWithFormat:@"name = 'Sato Taro'"]];
[person MR_deleteEntity];

今のところこんな感じです。新しいことがわかったら随時加えていきます。

UIAlertViewにテキストのinputをさせる

参考→【iOS5】UIAlertViewにsetAlertViewStyleでテキストフィールドを追加する!!

ここを参考に僕も実装しました
- (void) settingButtonTapped {
    UIAlertView *setTitle = [[UIAlertView alloc] initWithTitle:@"Set Title"
                                                       message:nil
                                                      delegate:self
                                             cancelButtonTitle:@"Cancel"
                                             otherButtonTitles:@"Save", nil];
    [setTitle setAlertViewStyle:UIAlertViewStylePlainTextInput];
    [[setTitle textFieldAtIndex:0] setText:habit.title];
    [setTitle show];
}

// Setボタンを有効にするかを決める
- (BOOL)alertViewShouldEnableFirstOtherButton:(UIAlertView *)alertView {
    NSString *inputText = [[alertView textFieldAtIndex:0] text];
    
    if( [inputText length] >= 1 ) {
        return YES;
    } else {
        return NO;
    }
}

// アラートのsetTitleのsaveボタンが押された
-(void)alertView:(UIAlertView*)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSString *input = [[alertView textFieldAtIndex:0] text];

    if (buttonIndex == 1) {
        NSLoG(@"%@", input);
    }
}

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