我有一个自定义的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
将帧设置回这些奇数大小。
答案 0 :(得分:4)
你需要获得内在大小和autoresizingMask。一旦你这样做,UITableView将停止使用你的tableHeaderView。
例如,如果您希望标题具有固定高度(取决于其内容),但您希望标题使用整个表格宽度,则可以执行以下操作:
1.使用以下自动调整遮罩配置创建视图(因此表格不会尝试增加标题视图高度):
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.
}