日々精進

新しく学んだことを書き留めていきます

自作Viewの初期化

初期化は普通initメソッド内でやるが、自作のViewクラスの場合、
XIBファイルからinitWithCoderが実行されて初期化されることが多い。
そうすると、初期化に必要な引数をinitメソッドに渡せない。
よって親ビューコントローラのviewDidLoad内でセッターを使ってインスタンス変数の初期化を行うことになる。


まとめ
・initメソッド内でやること
インスタンス変数にインスタンスを作って代入する。
複数回実行されたくない、または1回実行すれば十分な処理。例えば以下

- (void)commonInit {
    self.layerForShadow = [CALayer layer]; // インスタンスを作って代入
    self.layerForShadow.shadowOffset = CGSizeMake(2.5, 2.5); // デフォルト値
    self.layerForShadow.shadowColor = [[UIColor blackColor] CGColor];
    self.layerForShadow.shadowOpacity = 0.5;
    self.layerForShadow.backgroundColor = [UIColor blackColor].CGColor;
    [self.layer addSublayer:self.layerForShadow]; // 複数回実行されたくない処理
    self.layer.masksToBounds = YES;
}



その他必須の設定項目をすべて引数に取るセッターを作るとわかりやすいかも。

- (void)setFrame:(CGRect)frame cornerRadius:(CGFloat)cornerRadius centerColor:(UIColor *)centerColor  sideColor:(UIColor *)sideColor minHandle:(DoubleSliderHandle *)minHandle maxHandle:(DoubleSliderHandle *)maxHandle{
    self.frame = frame;
    self.layer.cornerRadius = cornerRadius;
    self.centerColor = centerColor;
    self.sideColor = sideColor;
    self.minHandle = minHandle;
    self.maxHandle = maxHandle;
    self.layerForShadow.frame = CGRectMake(-2.5, -self.frame.size.height, self.frame.size.width, self.frame.size.height);
}

↑が実質的なイニシャライザ。親ビューコントローラのviewDidLoadで実行する。