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)
| 归档时间: |
|
| 查看次数: |
3397 次 |
| 最近记录: |