7

サブクラス化するときUIView、私は通常、すべての初期化コードとレイアウトコードをそのinitメソッドに配置します。しかし、レイアウトコードはオーバーライドして実行する必要があると言われていますlayoutSuviews各メソッドがいつ呼び出されるかを説明するSOに関する投稿がありますが、実際にそれらを使用する方法を知りたいです。

私は現在、次のinitようにすべてのコードをメソッドに配置しています。

MyLongView.m

- (id)initWithHorizontalPlates:(int)theNumberOfPlates
{
    self = [super initWithFrame:CGRectMake(0, 0, 768, 1024)];

    if (self) {
        // Initialization code
        _numberOfPlates = theNumberOfPlates;

        UIScrollView *scrollView = [[UIScrollView alloc] initWithFrame:self.frame];
        [scrollView setContentSize:CGSizeMake(self.bounds.size.width* _numberOfPlates, self.bounds.size.height)];
        [self addSubview:scrollView];

        for(int i = 0; i < _numberOfPlates; i++){
            UIImage *img = [UIImage imageNamed:[NSString stringWithFormat:@"a1greatnorth_normal_%d.jpg", i+1]];
            UIImageView *plateImage = [[UIImageView alloc] initWithImage:img];
            [scrollView addSubview:plateImage];
            plateImage.center = CGPointMake((plateImage.bounds.size.width/2) + plateImage.bounds.size.width*i, plateImage.bounds.size.height/2);
        }

    }
    return self;
}

これは通常のタスクです。ビューのフレームの設定、ivarの初期化、スクロールビューの設定、UIImageの初期化、UIImageViewsへの配置、レイアウトです。

私の質問は、これらのどれをで行うべきかinit、そしてこれらのどれをで行うべきlayoutSubviewsかということです。

4

2 に答える 2

16

initは、必要なデータを使用してすべてのオブジェクトを作成する必要があります。initでそれらに渡すフレームは、理想的にはそれらの開始位置である必要があります。

次に、layoutSubviews:内で、すべての要素のフレームを変更して、要素が配置される場所に配置します。layoutSubviewsで割り当てや初期化を行うことはできません。位置、サイズなどを変更するだけです。

于 2012-11-01T12:49:17.213 に答える
4

自動サイズ変更がautoresizingFlagsまたはautolayoutだけで完全に機能する場合は、initを使用してビュー全体を設定できます。

ただし、一般に、layoutSubviewsでレイアウトを行う必要があります。これは、ビューフレームが変更されるたびに、およびレイアウトが再度必要になるその他の状況で呼び出されるためです。init内のビューの最終フレームがわからない場合があるため、最終サイズが設定された後にレイアウトを行うため、前述のように柔軟にするか、layoutSubviewsを使用する必要があります。

WDUKが述べたように、すべての初期化コード/オブジェクトの作成は、initメソッドまたは任意の場所にある必要がありますが、layoutSubviewsにはありません

于 2012-11-01T12:56:16.633 に答える