在加载和旋转期间,UITableView的tableHeaderView height属性更改为奇怪的值

Mag*_*ave 5 iphone frame uitableview autorotate ios

我有一个自定义UIView,在loadView期间将其设置为UITableView的tableHeaderView属性:

headerView = [[MYViewClass alloc] initWithFrame:CGRectMake(0, 0, self.view.frame.size.width, 120)];
[headerView sizeToFit];

self.tableView.tableHeaderView = headerView;
Run Code Online (Sandbox Code Playgroud)

视图绘制不正确,部分视图被剪切,表格上方有空白。旋转设备时,视图几乎消失了。现在,旋转回去时,视图变得更大,以至于页眉的空间并遮盖了表格中的某些单元格。

为了排除故障,我在自定义视图类中覆盖了setFrame方法:

- (void) setFrame:(CGRect)frame {
    [super setFrame:frame];
    NSLog(@"%@ - %@", NSStringFromSelector(_cmd), NSStringFromCGRect(frame));
}
Run Code Online (Sandbox Code Playgroud)

我还在NSLog语句上设置了一个断点,这样我就可以看到称为setFrame的内容,并且得到一些我无法解释的奇怪结果,希望有人可以对正在发生的事情和原因有所了解。

在loadView期间

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}}
Run Code Online (Sandbox Code Playgroud)

向左旋转设备

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}}
Run Code Online (Sandbox Code Playgroud)

向右旋转设备

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}}
Run Code Online (Sandbox Code Playgroud)

这就解释了为什么我的视图最初被截断,然后几乎消失,最后最终与细胞重叠。看来这_resizeWithOldSuperviewSize是罪魁祸首,我不明白的是为什么要调用它以及从何处获得这些奇数。

我有一个非常垃圾的工作围绕通过调用[self.tableView.tableHeaderView sizeToFit]viewDidAppear:didRotateFromInterfaceOrientation:这使框架回到正确的大小,但重绘是可怕既发生后视图可见或旋转动画之后。尝试在视图可见之前随时_resizeWithOldSuperViewSize进行设置会导致将帧设置回这些奇数大小。

小智 5

您需要获得固有大小和正确的autoresizingMask。完成此操作后,UITableView将停止与tableHeaderView绑定。

例如,如果您希望标题具有固定的高度(取决于其内容),但是希望标题使用整个表的宽度,则可以这样做:

1.使用以下自动调整大小的蒙版配置创建视图(因此表不会尝试增加标题视图的高度):

在此处输入图片说明
2.使用AutoLayout添加子视图,以便顶部/底部锚点与您的视图相匹配(这样子视图就可以定义标题视图的高度)
3.如下添加标题视图:

let headerView : CustomView? = CustomView.fromNib()
headerView?.sizeToFit()

tableView.tableHeaderView = headerView
Run Code Online (Sandbox Code Playgroud)


小智 -3

创建一个新的 xib 文件,然后在 xib 文件中自定义您的首选大小。假设 xib 名为 customHeader (.xib) 声明:

  IBOutlet UIView *customView;
Run Code Online (Sandbox Code Playgroud)

将 customView 分配给 xib 中的该视图。

  -(UIView *)viewOfCategory;
Run Code Online (Sandbox Code Playgroud)

以 .m 为单位:

   -(UIView *)viewOfCategory {

if (!customView) {

        [[NSBundle mainBundle] loadNibNamed:@"customHeader" owner:self options:nil];
}

return customView;
   }
Run Code Online (Sandbox Code Playgroud)

然后调用这个UITableView方法:

  -(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:        (NSInteger)section {

return [self customView];

}
Run Code Online (Sandbox Code Playgroud)

最后也是最重要的是,它将回答您的问题!实现另一个 UITableView 方法:

   -(CGFloat)tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {

// You can just return default size of your xib: return [[self viewOfCategory]          bounds].size.height;


       // Or you can return custom size using  CGRect or whatever. 
     }
Run Code Online (Sandbox Code Playgroud)