我正在将iPhone应用程序转换为iPad,而我却陷入了无辜且看似微不足道的定位问题。我有一个UITableViewCell只包含一个UISwitch,以单元格为中心。单元格位于具有Grouped样式的UITableView中。
在iPhone上,我只是将开关的中心属性设置为tableView:cellForRowAtIndexPath:
中单元格的中心。 对于iPhone来说就足够了,因为无论桌面风格如何,单元格的中心都是相同的。这也发生在iPhone上,但偏移量较小,因此差异更加微妙。这是iPhone的代码:
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
UISwitch *view = [[UISwitch alloc] initWithFrame:CGRectZero];
[view addTarget:self action:@selector(switchChanged:) forControlEvents:UIControlEventValueChanged];
view.center = cell.center;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
[cell.contentView addSubview:view];
[view release];
在iPad上,无需更改任何代码,开关的位置仍然位于iPhone屏幕的中央。这很糟糕,因为iPad比iPhone大。所以我将定位代码移动到tableView:willDisplayCell:forRowAtIndexPath:
,现在它位于中心的另一侧(靠近屏幕的右侧)。
-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
UISwitch *s = (UISwitch *)[cell.contentView viewWithTag:SwitchTag];
s.center = CGPointMake(cell.contentView.center.x,s.center.y); //pushes the switch too far to the right
}
然而,当我记录我感兴趣的各种坐标和框架时,我得到了我所期望的:单元格中心的x坐标是384.0,这是屏幕宽度的一半。我也尝试重新计算UISwitch的整个帧,但由于我使用了屏幕的值,因此开关最终位于同一位置,距离右侧太远。
我认为正在进行的是在调用tableView:willDisplayCell:forRowAtIndexPath:
之前(或之前,甚至之前)有一些变换来渲染所有这些数字毫无意义。它看起来好像整个单元格被 x 移动了,其中 x 是从屏幕边缘到单元格起点的距离,即使没有报告在frame
属性中。
我确信我有一些微不足道的东西。请赐教。
答案 0 :(得分:0)
它可能不是最优雅的解决方案,并且当然也没有开始深入了解为什么事情不是你希望他们在搞乱tableCell视图的基础行为但是
view.center =CGPointMake(tableView.center.x-(view.frame.size.width/2), cell.center.y) ;
如果你使用那条线而不是你发布的那条线,它应该很高兴(至少它在我的快速测试中看起来那样)将它们放在桌子的中间。
答案 1 :(得分:0)
分组细胞的工作方式略有不同。我遇到了类似的问题,但你正在考虑关于中心的事情。有时为各种不同的视图(cell.backgroundColor,cell.contentView.backgroundColor等)临时设置背景颜色将帮助您更好地可视化它。
您可能需要执行以下操作:
s.center = CGPointMake(s.superview.bounds.size.width / 2.0,s.center.y);
如果这不起作用,我相信你是对的,它在渲染时对坐标做了些什么。如果是这种情况,那么你将不得不编写自己的UITableViewCell子类,这不是世界上最糟糕的事情。