2011年5月31日火曜日

UIScrollViewの加速度スクロールを任意のタイミングで止める方法

力技。
他に良い方法があれば教えて下さい……!

// スーパービューを取得
UIView* scrollSuperView = scrollView.superview;

// 外したときに解放されないように、参照カウントを上げてからautoreleaseをかけておく
[[scrollView retain] autorelease];

// 親ビューから外す
[scrollView removeFromSuperview];

// 親ビューに追加しなおす
[scrollSuperView addSubview:scrollView];

2011年5月28日土曜日

Objective-Cでクラス定数っぽいもの

// 定義

@property (nonatomic, assign, readonly) CGRect defaultFrame;


// 実装

@dynamic defaultFrame;

- (CGRect) defaultFrame
{
  return CGRectMake(0, 0, 320, 480); 
}

プロパティで宣言するのは、ピリオド演算子を使ってインスタンスから直接アクセスするためです。

例)  self.frame = self.defaultFrame;


参考: getterのブラケット記法をドットに置き換える方法

2011年5月23日月曜日

リファクタリングしても怖くないNibNameの指定方法

RootViewController* viewController;
NSString* nibName;

// 怖い書き方
nibName = @"RootViewController";
viewController = [[RootViewController alloc] initWithNibName:nibName bundle:nil];

// 怖くない書き方
nibName = [[RootViewController class] description];
/* または
  nibName = NSStringFromClass([
RootViewController class]);

 */
viewController = [[RootViewController alloc] initWithNibName:nibName bundle:nil];

NSString* nibName1 = @"RootViewController";
NSString* nibName2 = [[RootViewController class] description];

if ([nibName1 isEqualToString:nibName2]) {
  NSLog(@"いっしょです");
}

2011年5月20日金曜日

Objective-Cで"Sleep sort"

常識を覆すソートアルゴリズム!その名も"sleep sort"!
http://d.hatena.ne.jp/gfx/20110519/1305810786

Genius sorting algorithm: Sleep sort
http://dis.4chan.org/read/prog/1295544154

Objective-Cで。

- (void)somewhere {  
  NSArray* numbers = [NSArray arrayWithObjects:
                      [NSNumber numberWithFloat:1.1],
                      [NSNumber numberWithFloat:4.7],
                      [NSNumber numberWithFloat:0.9],
                      [NSNumber numberWithFloat:1.2],
                      [NSNumber numberWithFloat:7.7],
                      [NSNumber numberWithFloat:3.5],
                      [NSNumber numberWithFloat:6.9],
                      [NSNumber numberWithFloat:6.6],
                      [NSNumber numberWithFloat:9.5],
                      [NSNumber numberWithFloat:8.9],
                      [NSNumber numberWithFloat:2.5],
                      [NSNumber numberWithFloat:6.0],
                      [NSNumber numberWithFloat:9.4],
                      [NSNumber numberWithFloat:9.5],
                      [NSNumber numberWithFloat:3.5],
                      [NSNumber numberWithFloat:4.1],
                      [NSNumber numberWithFloat:1.3],
                      [NSNumber numberWithFloat:0.7],
                      [NSNumber numberWithFloat:1.4],
                      [NSNumber numberWithFloat:3.3], nil];
  
  NSLog(@"---- ↓ソート前 ----");
  
  for (NSNumber* number in numbers) {
    NSLog(@"%.1f", [number floatValue]);
    [self performSelector:@selector(sort:)
               withObject:number
               afterDelay:[number floatValue]];
  }
  
  NSLog(@"---- ↓ソート後 ----");
}

- (void)sort:(NSNumber *)number
{
  NSLog(@"%.1f", [number floatValue]);
}

ちゃんとソートされる……

Objective-Cでメソッドチェーン

//  JQ.h

//    ブロック構文のプロパティを作る

//    ブロックは自身と同一なクラスを返すようにする

//    引数はなんでも良い


@property (nonatomic, retain) JQ* (^call)(const char *);


//  JQ.m

//    たとえば自分に変更を加えたり、新しく作ったりして返す


- (JQ *(^)(const char *))call

{

  JQ* (^method)(const char *) = (JQ *(^)(const char *))(^(const char *statement) {

    [self add:statement];

    return self;

  });

  

  return method;

}


- (void)somewhere

{

  self.call("test1").call("test2").call("test3").call("test4").call("test5");

}

block構文 その2

プロパティとして使う場合 (ブロック構文の読み書き)

@property (nonatomic, retain) NSString* (^convert)(NSString *);

メソッドとして使う場合(ブロック構文を返すgetter)

- (NSString *(^)(NSString *))convert;

ややこしいですね。

2011年5月19日木曜日

block構文

型定義いつも忘れるのでメモ。


void (^move)(UIView*, CGRect) = ^(UIView* view, CGRect frame) {
  [view setFrame:frame];
};
  
move(view, CGRectMake(0, 0, 100, 100));

普通に作るときはこんなで、


- (void)animation:(void (^)(UIView* view, CGRect frame))moving;

[self animation:^(UIView* view, CGRect frame) {
  [view setFrame:frame];
}];

関数の引数にするときはこんなん。