初めて知ったメソッド

UIViewも奥が深いですね。 だいたい使うメソッドは決まっていて不都合も感じていなかったのですが、またひとついいメソッドがあることを知りました。willMoveToSuperview:とdidMoveToSuperviewの2つのメソッドです。

説明

両方ともメソッド名からなんとなくどのタイミングで呼ばれるかがわかりますね(笑

willMoveToSuperview:は自分(UIView)が親(superview)にaddされた直前に呼ばれます。didMoveToSuperviewは直後に呼ばれます。

また、removeFromSuperviewでsuperviewから取り除かれた時にも呼ばれます。その場合、willMoveToSuperviewの引数にはnilが入っています。

大抵の場合、layoutSubviewsでなんとかなるような気がしますが、覚えていて損はないメソッドだと思います。 特にwillMoveToSuperview:は引数にsuperviewが入っているので、親ビューとの調整には持って来いだと思います。

サンプルコード

コード(UIViewController)

親のビューに子ビューをAddした後Removeする意味のないコード。

- (void)viewDidLoad
{
    [super viewDidLoad];

    CustomView *customView = [[CustomView alloc] initWithFrame:self.view.bounds];
    NSLog(@"before addSubView");
    [self.view addSubview:customView];
    NSLog(@"after addSubView");

    NSLog(@"before removeSubView");
    [customView removeFromSuperview];
    NSLog(@"after removeSubView");

}

コード(CustomView)

CustomViewクラスに以下の内容を追加

- (void)didMoveToSuperview
{
    NSLog(@"didMoveToSuperView");
}

- (void)willMoveToSuperview:(UIView *)newSuperview
{
    NSLog(@"willMoveToSuperView");
}

- (void)layoutSubviews
{
    NSLog(@"layoutSubviews");
}

結果

UIViewMethodTest[35425:a0b] before addSubView
UIViewMethodTest[35425:a0b] willMoveToSuperView
UIViewMethodTest[35425:a0b] didMoveToSuperView
UIViewMethodTest[35425:a0b] after addSubView

UIViewMethodTest[35425:a0b] before removeSubView
UIViewMethodTest[35425:a0b] willMoveToSuperView
UIViewMethodTest[35425:a0b] didMoveToSuperView
UIViewMethodTest[35425:a0b] after removeSubView