【发布时间】:2012-10-26 00:16:55
【问题描述】:
我想知道是否有人知道为什么当您在viewDidLoad 和viewWillAppear 中设置子视图的框架时,更改不会在屏幕上生效,但如果您在viewDidAppear 中设置它,他们会这样做吗?
在我的例子中,我正在加载一个带有两个表视图的自定义 xib,然后尝试在 viewDidLoad 中将它们向下移动,以便为 viewDidLoad 中添加的另一个视图留出空间,因为并不总是需要显示它。
问题是当我在viewDidLoad 或viewWillAppear 中设置框架时,它设置在对象上,我可以通过打印看到它,但它没有反映在屏幕上。将我设置的框架调用移动到 viewDidAppear 将使一切按预期工作。
认为我应该能够在viewDidLoad 中设置框架是错误的吗?
- (id)init {
if ( self = [super initWithNibName:@"MyView" bundle:nil] ) {}
return self;
}
- (void)viewDidLoad {
[super viewDidLoad];
self.descriptionWebView = [[[UIWebView alloc] initWithFrame:CGRectMake( 0, 0, self.view.frame.size.width, 200 )] autorelease];
[self.view addSubview:self.descriptionWebView];
self.tableView1.autoresizingMask = UIViewAutoresizingNone;
self.tableView2.autoresizingMask = UIViewAutoresizingNone;
[self.descriptionWebView loadRequest:[NSURLRequest requestWithURL:[[NSBundle mainBundle] URLForResource:@"...." withExtension:@"html"]]];
table1LocationWithHeader = CGRectMake( self.tableView1.frame.origin.x, 200, self.tableView1.frame.size.width, self.tableView1.frame.size.height - 200 );
table2LocationWithHeader = CGRectMake( self.tableView2.frame.origin.x, 200, self.tableView2.frame.size.width, self.tableView2.frame.size.height - 200 );
//this will NOT work
self.tableView1.frame = table1LocationWithHeader;
self.tableView2.frame = table2LocationWithHeader;
}
- (void)viewWillAppear:(BOOL)animated {
[super viewWillAppear:animated];
//this will NOT work
self.tableView1.frame = table1LocationWithHeader;
self.tableView2.frame = table2LocationWithHeader;
}
- (void)viewDidAppear:(BOOL)animated {
[super viewDidAppear:animated];
//this WILL work
self.tableView1.frame = table1LocationWithHeader;
self.tableView2.frame = table2LocationWithHeader;
}
//I added these after comments for stack overflow users, it seems like viewDidLayoutSubviews is the best place to set the frame
- (void)viewWillLayoutSubviews {
[super viewWillLayoutSubviews];
//this will NOT work
self.tableView1.frame = table1LocationWithHeader;
self.tableView2.frame = table2LocationWithHeader;
}
- (void)viewDidLayoutSubviews {
[super viewDidLayoutSubviews];
//this WILL work
self.tableView1.frame = table1LocationWithHeader;
self.tableView2.frame = table2LocationWithHeader;
}
【问题讨论】:
-
你可以显示你的代码吗?
-
注意!您的 viewWillAppear 调用
[super viewDidAppear];看起来像复制粘贴错误。
标签: objective-c ios uiview viewdidload viewdidappear