【发布时间】:2012-03-04 03:06:21
【问题描述】:
我有一个自定义 UIView,我在 loadView 期间将其设置为 UITableView 的 tableHeaderView 属性:
headerView = [[MYViewClass alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 120)];
[headerView sizeToFit];
self.tableView.tableHeaderView = headerView;
视图绘制不正确,部分视图被剪裁,表格上方有空白。旋转设备时,视图几乎消失。向后旋转时,视图现在比标题的空间更大,并遮住了表格中的一些单元格。
为了解决问题,我在自定义视图类中覆盖了 setFrame 方法:
- (void) setFrame:(CGRect)frame {
[super setFrame:frame];
NSLog(@"%@ - %@", NSStringFromSelector(_cmd), NSStringFromCGRect(frame));
}
我还在 NSLog 语句上设置了一个断点,这样我就可以看到所谓的 setFrame 了,我得到了一些我无法解释的奇怪结果,希望有人能阐明正在发生的事情和原因。
加载视图期间
1. initWithFrame calls: setFrame: - {{0, 0}, {320, 120}}
2. sizeToFit calls: setFrame: - {{0, 0}, {320, 109}}
3. setTableHeaderView calls: setFrame: - {{0, 0}, {320, 109}}
4. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 109}}
5. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {320, 65}}
6. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 65}}
7. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 65}}
向左旋转设备
1. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {480, 0}}
2. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {480, 0}}
3. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {480, 12}}
4. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {480, 12}}
向右旋转设备
1. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {320, 172}}
2. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 172}}
3. _resizeWithOldSuperviewSize calls: setFrame: - {{0, 0}, {320, 160}}
4. _adjustTableHeaderAndFooterViews calls: setFrame: - {{0, 0}, {320, 160}}
这解释了为什么我的视图最初看起来被截断,然后几乎消失并最终与单元格重叠。看来_resizeWithOldSuperviewSize 是罪魁祸首,我不明白为什么要调用它以及它从哪里得到这些奇怪的值。
我通过在viewDidAppear: 和didRotateFromInterfaceOrientation: 中调用[self.tableView.tableHeaderView sizeToFit] 来解决一个非常垃圾的工作,这会将框架恢复到正确的大小,但是重绘很糟糕,因为两者都发生在视图可见或旋转动画之后.尝试在视图可见之前的任何时间设置此设置会导致 _resizeWithOldSuperViewSize 将框架设置回这些奇怪的大小。
【问题讨论】:
标签: iphone ios uitableview frame autorotate