我创建了一个从 xib 文件加载的自定义视图,如下所示:
- (id)initWithFrame:(CGRect)frame {
self = [super initWithFrame:frame];
if (self) {
// Initialization code.
[[NSBundle mainBundle] loadNibNamed:@"TachoView" owner:self options:nil];
[self addSubview:self.view];
[self initUi];
}
return self;
}
当设备方向发生变化时,我现在遇到一些子视图的自动调整大小和定位问题。这些屏幕截图描述了行为。
viewDidLoad 之后一切看起来都很好:
旋转到横向模式后,布局仍然很好:
但是当旋转回纵向时,它看起来像这样:
如果我在单视图虚拟项目中测试它们,相同的文件 .h、.m 和 .xib 可以正常工作。所以我认为,在xib中定位和调整大小的设置是可以的。我的应用程序的不同之处在于,该视图位于具有其他几个视图的滚动视图上。在方向更改时,我会更改所有这些视图的大小,以便按预期布局所有内容。相关代码是最里面的for循环:
-(void) viewWillLayoutSubviews {
float h = self.view.frame.size.height;
float w = self.view.frame.size.width;
// set the size of the vertical scrollview
verticalView.frame = CGRectMake(0, 0, w, h * gridHeight);
verticalScrollView.frame = CGRectMake(0, 0, w, h);
[verticalScrollView setContentSize:CGSizeMake(w, h * gridHeight)];
[verticalScrollView layoutIfNeeded];
// set the size of the horizontal scrollviews
for (int i=0; i<verticalView.subviews.count; i++) {
UIScrollView *scrollView = (UIScrollView *) [verticalView.subviews objectAtIndex:i];
UIView *container = (UIView *) [[scrollView subviews] objectAtIndex:0];
int subviewCount = container.subviews.count;
scrollView.frame = CGRectMake(0, h*i, w, h);
[scrollView setContentSize:CGSizeMake(w * subviewCount, h)];
container.frame = CGRectMake(0, 0, w * subviewCount, h);
// set the size of the actual views
for (int j=0; j<container.subviews.count; j++) {
UIView *view = [container.subviews objectAtIndex:j];
// FIXME manchmal crashed hier die WebView. Muss das hier im
// ui thread ausgeführt werden? wird diese methode nicht vom
// ui thread aufgerufen?
view.frame = CGRectMake(w*j, 0, w, h);
}
}
}
任何想法,第二个方向改变出了什么问题?我可以手动布局整个视图,但我认为自动调整大小功能也可以。