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

时间:2012-02-12 10:53:32

标签: iphone ios uitableview frame autorotate

我有一个自定义的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的内容,我得到了一些我无法解释的奇怪结果,并希望有人可以了解正在发生的事情和原因。

在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}}

向左旋转设备

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是罪魁祸首,我不明白为什么它被调用以及从哪里得到这些奇怪的值。

我通过调用[self.tableView.tableHeaderView sizeToFit]viewDidAppear:中的didRotateFromInterfaceOrientation:来解决这个问题,这使得框架恢复到正确的大小但是重绘非常糟糕,因为两者都发生在视图之后可见或旋转动画后。尝试在视图可见之前随时设置此选项会导致_resizeWithOldSuperViewSize将帧设置回这些奇数大小。

4 个答案:

答案 0 :(得分:4)

你需要获得内在大小和autoresizingMask。一旦你这样做,UITableView将停止使用你的tableHeaderView。

例如,如果您希望标题具有固定高度(取决于其内容),但您希望标题使用整个表格宽度,则可以执行以下操作:

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

enter image description here
2.使用AutoLayout添加子视图,以使顶部/底部锚点与您的视图匹配(这样您的子视图就可以定义标题视图的高度)
3.像这样添加标题视图:

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

tableView.tableHeaderView = headerView

答案 1 :(得分:2)

它将通过autoresizingMask的{​​{1}}属性帮助您read up查看Apple的视图大小调整方案。可能的值有:

UIView

我毫不怀疑,经过一些实验,你会找到合适的大小调整面具组合来解决你的问题。

此外,请注意enum { UIViewAutoresizingNone = 0, UIViewAutoresizingFlexibleLeftMargin = 1 << 0, UIViewAutoresizingFlexibleWidth = 1 << 1, UIViewAutoresizingFlexibleRightMargin = 1 << 2, UIViewAutoresizingFlexibleTopMargin = 1 << 3, UIViewAutoresizingFlexibleHeight = 1 << 4, UIViewAutoresizingFlexibleBottomMargin = 1 << 5 }; typedef NSUInteger UIViewAutoresizing; ,根据相同的文档来源“调整大小并移动接收器视图,以便它只包含其子视图。”在创建视图之后和将其放入表头之前调用它似乎是不合适的。

答案 2 :(得分:1)

当我想要使用SearchBar的表头视图和底部的一些自定义UI时,我遇到了完全相同的问题。有趣的是,如果你只保留SearchBar,它的工作就完美了。

所以我决定应用一个非常脏的黑客,在你自定义的UIView的重写帧设置器中重置Frame的高度(你记录帧大小)到你需要的东西(在你的情况下它是120)。

- (void) setFrame:(CGRect)frame {
    frame.Height = 120;
    [super setFrame:frame];
}

之后,旋转时没有奇怪的标题视图和表重叠。希望它有所帮助。

P.S。顺便说一句,我在自定义UIView中使用自动布局。

答案 3 :(得分:-3)

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

  IBOutlet UIView *customView;

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

  -(UIView *)viewOfCategory;

在.m:

   -(UIView *)viewOfCategory {

if (!customView) {

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

return customView;
   }

然后调用此UITableView方法:

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

return [self customView];

}

最后,最重要的是,这将是您的疑问!实现另一个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. 
     }