[英]Placing UIViews one after another
我有一個視圖控制器,其中包含一個子視圖數組。 這些子視圖是自定義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;
}
}
我正在根據以下評論進行編輯和總結:
這些方法的調用順序如下:
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中移出,並將其放在單獨的view方法(可能是mySize)中,然后從viewcontroller的viewWillLayoutSubviews中調用該方法,也可以從視圖的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。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.