UIView及UIViewController的使用Best Practice初探(2)

上次提到了UIViewController裡面建立UIView時的建立流程的Best Practice的探討。這次來聊聊在UIView裡面建立instance的方式。

事實上,建立的流程跟上一篇有87%像,基本上都是用相同的原則在建立。

在UIView中,同樣地Apple也提供了在建立的過程中的相對應的Call back,分別是:

  1. - (instancetype)initWithFrame:(CGRect)frame
  2. - (void)layoutSubviews

當然實際上UIView所提供的Call back不只這兩個而已,但是為了清楚說明所以先選這兩個為主。

常在用UIView建立instance的人就會知道在initWithFrame時是建立UIView的大小的方式。而如果今天你建立一個Class繼承UIView,想要讓該UIView自己本身多做一點事,或是放一些元件在該UIView裡面時,上述的這兩個方法就非常重要了,因為它們能幫助你建立元件在創建的時間軸順序。

比如說在initWithFrame時,你可以把相關的元件的instance此區塊先建立好,但先不用給元件位置,或大小等資訊。等到layoutSubviews時在把位置及大小等資訊跟UIView說就好,如此一來,整段code的邏輯就非常清楚了。

直接舉實際的例子如下:

- (instancetype)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self)
{
UILabel *label = [[UIButton alloc] initWithFrame:CGRectZero];

[self addSubview:label]
        label.text = @"Hello World";
    {
    return self;
}
- (void)layoutSubviews
{
[super layoutSubviews];

label.frame = CGRectMake(100, 100, 100, 100);
}

上面就是一個最基本的例子,當要在UIView裡面建立UILabel時,可以把建立的流程區分成:

  1. 建立instance
  2. 指定位置及大小

畢竟一開始UIView就有提供相對應的call back了,直接使用不僅可以讓邏輯清楚,整個程式碼也開始清楚許多了!

One clap, two clap, three clap, forty?

By clapping more or less, you can signal to us which stories really stand out.