0

サブビューの配列を持つView Controllerがあります。これらのサブビューは、縦に次々と配置されるカスタム UIView です。サブビューの高さが一貫していません。それらの高さは、それらをインスタンス化するときに使用されるデータに基づいています。さらに、サブビューの UILabels が横向きモードで水平方向に拡大し、短くなるように、デバイスの回転をサポートしたいと考えています。

私はこれを良い方法で達成するのに多くの問題を抱えています。ビューコントローラーがサブビューをレイアウトしているとき、各サブビューの高さを把握する明確な方法がないように感じます (この時点でサブビューをインスタンス化しましたが、フレームを設定していないため)。私のフラストレーションを理解するには、以下のコードを参照してください。

サブビューのメソッドがビュー コントローラーlayoutSubviewsのメソッドの前に呼び出された場合、私は本当にそれを望んでいますが、そうではありません。viewWillLayoutSubviews

MyViewController.m

....

- (void)initWithDataObjects:(NSArray*)dataObjects
{
    _dataObjects = dataObjects;
}

- (void)viewDidLoad
{
    mySubviews = [[NSMutableArray alloc] init];

    for (DataObject* do in _dataObjects) {
        MyCustomView *customView = [[MyCustomView alloc] initWithDataObject:do];
        [mySubviews addObject:customView];
        [self.view addSubview:customView];
    }
}

- (void)viewWillLayoutSubviews
{
    int currentHeight = 0;
    for (MyCustomView *customView in mySubviews) {

        int subviewHeight = customView.frame.size.height;
        // PROBLEM: subviewHeight is 0 because the subview hasn't called layoutSubviews yet..

        [customView setFrame:CGRectMake(0, currentHeight, self.view.frame.size.width, subviewHeight)];
        currentHeight += subviewHeight;
    }
}
4

1 に答える 1

1

以下のコメントに基づいて編集および要約しています。

これらのメソッドが呼び出される順序は次のとおりです。

2013-10-24 01:05:11.391 MyTestApp[34166:70b] -[MyViewController viewDidLoad]
2013-10-24 01:05:11.395 MyTestApp[34166:70b] -[MyViewController addMySubViews]
2013-10-24 01:05:11.395 MyTestApp[34166:70b] -[view1 didMoveToSuperview]
2013-10-24 01:05:11.395 MyTestApp[34166:70b] -[view2 didMoveToSuperview]
2013-10-24 01:05:11.395 MyTestApp[34166:70b] -[view3 didMoveToSuperview]
2013-10-24 01:05:11.398 MyTestApp[34166:70b] -[MyViewController viewWillLayoutSubviews]
2013-10-24 01:05:11.398 MyTestApp[34166:70b] -[MyViewController viewDidLayoutSubviews]
2013-10-24 01:05:11.398 MyTestApp[34166:70b] -[view1 layoutSubviews]
2013-10-24 01:05:11.398 MyTestApp[34166:70b] -[view2 layoutSubviews]
2013-10-24 01:05:11.398 MyTestApp[34166:70b] -[view3 layoutSubviews]

あなたの最善の策は、サイズ変更コードをビューのlayoutSubviewsから取り出し、それを別のビューメソッド(おそらくmySize)に入れ、viewWillLayoutSubviewsのviewcontrollerからそのメソッドを呼び出すことです。また、ビューのlayoutSubviewsから呼び出すこともできます(したがって、重複コードはありません)。

これは次のようになります (viewWillLayoutSubviews はすべてのサブビューの mySize メソッドを呼び出しています)。

2013-10-24 01:38:10.501 MyTestApp[34850:70b] -[MyViewController viewDidLoad]
2013-10-24 01:38:10.501 MyTestApp[34850:70b] -[MyViewController addMySubViews]
2013-10-24 01:38:10.501 MyTestApp[34850:70b] -[view1 didMoveToSuperview]
2013-10-24 01:38:10.501 MyTestApp[34850:70b] -[view2 didMoveToSuperview]
2013-10-24 01:38:10.502 MyTestApp[34850:70b] -[view3 didMoveToSuperview]
2013-10-24 01:38:24.396 MyTestApp[34850:70b] -[MyViewController viewWillLayoutSubviews]
2013-10-24 01:38:24.396 MyTestApp[34850:70b] -[view1 mySize]
2013-10-24 01:38:24.396 MyTestApp[34850:70b] -[view2 mySize]
2013-10-24 01:38:24.396 MyTestApp[34850:70b] -[view3 mySize]
2013-10-24 01:38:24.397 MyTestApp[34850:70b] -[MyViewController viewDidLayoutSubviews]
2013-10-24 01:38:24.397 MyTestApp[34850:70b] -[view1 layoutSubviews]
2013-10-24 01:38:24.397 MyTestApp[34850:70b] -[view2 layoutSubviews]
2013-10-24 01:38:24.397 MyTestApp[34850:70b] -[view3 layoutSubviews]

ところで、サブビューのフレームをviewcontroller内から変更すると、サブビューでneedsLayoutがトリガーされ、最終的にlayoutSubviewsがトリガーされます。

于 2013-10-24T06:25:57.727 に答える