2

My Viewcontroller に Scroll ビューがあります。また、ビューを作成し、それを IBOutlet 変数に接続しました。Scroll ビューに多くのビューを追加する必要があります。

ビューを ScrollView に追加するコード:

.h ファイル内

UIView *customView_;

@property (nonatomic, retain) IBOutlet UIView *customView;

.m ファイル内:

@synthesize customView = customView_;

    for (int i = 0; i < 2; i++) {

        UIView *tempView = customView;
        tempView.frame = CGRectMake(i * 187, 0, 187, 133);
        [scrollView addSubview:tempView];
    }

しかし、上記のコードを使用すると、187,0,187,133 の位置に 1 つしか表示されません。コードを for に変更すると(int i = 0; i < 3; i++) {、374,0,187,133 でのみビューを表示できます。誰でもこのエラーを解決するのを手伝ってもらえますか?

4

1 に答える 1

5

なぜこうなった?

のドキュメントaddSubview:

ビューはスーパービューを 1 つだけ持つことができます。ビューに既にスーパービューがあり、そのビューがレシーバーでない場合、このメソッドはレシーバーを新しいスーパービューにする前に以前のスーパービューを削除します。

このコードで

UIView *tempView = customView;
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

同じビューを 2 回または 3 回追加しようとしています。ドキュメントからのコメントにより、これにより前のコメントが削除され、新しい位置に追加されます。(あなたの場合、スーパービューはレシーバーですが、ビューをコピーして再度追加するという意味ではありません)。

解決

残念ながら、プロトコルUIViewに従っていません。NSCopyingそのため、を使用して直接コピーを作成することはできませんcopy。次のように、ビューを作成するファクトリ メソッドを作成する必要があります。

-(UIView)createCustomView {
    ...
}

for次に、ループでそれを呼び出します。

UIView *tempView = [self createCustomView];
tempView.frame = CGRectMake(i * 187, 0, 187, 133);
[scrollView addSubview:tempView];

これは、.xib ファイルの範囲を超える可能性があります。これをInterface Builderでうまく機能させる方法については、この回答を参照してください。

于 2012-11-20T10:49:07.897 に答える