我正在尝试UISegmentedControl
在一个组中加入一个UITableViewCell
,就像在设置应用程序中的 wifi 设置中一样。我遇到的问题是我得到了双边框。我得到一个边框,一个UISegmentedControl
边框UITableViewCell
。
我猜我需要从UITableViewCell
. 我该怎么做呢?
我正在尝试UISegmentedControl
在一个组中加入一个UITableViewCell
,就像在设置应用程序中的 wifi 设置中一样。我遇到的问题是我得到了双边框。我得到一个边框,一个UISegmentedControl
边框UITableViewCell
。
我猜我需要从UITableViewCell
. 我该怎么做呢?
我只是注意到这仍在得到答案。碰巧我不得不为另一个项目做这件事,自从我问了这个问题以来,我学到了更多关于 iPhone 开发的知识。这是我最近解决它的方法。这一切都是为了使框架具有正确的尺寸。这应该适用于标准表。
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"CellIdentifier"];
if(cell == nil)
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"CellIdentifier"] autorelease];
UISegmentedControl *segmentedControl = [[UISegmentedControl alloc] initWithFrame:CGRectMake(-1.0f, -1.0f, 302.0f, 46.0f)];
[cell.contentView addSubview:segmentedControl];
在 Wi-Fi 设置的情况下,我怀疑他们所做的是让“忘记此网络”按钮、“IP 地址”标签和“DHCP/BootP/Static”分段控制表的所有部分标题视图。如果您需要在表格中间执行此操作(而不是在顶部或底部,您将分别使用tableHeaderView
和tableFooterView
属性),我建议使用委托方法-tableView:viewForHeaderInSection:
with-tableView:heightForHeaderInSection
或相应的Footer
变体。使用其中任何一个,您将为表格视图的“部分”设置一个自定义视图(使用清晰的背景颜色或[UIColor groupTableBackgroundColor]
),其中包含一个标签和一个分段控件,以便它们与其余部分匹配表部分。
使用这篇文章中的技术来删除 UITableViewCell 的背景不透明度对我来说更容易让 UISegmentedControl 只显示在表格行中。
我对此有了更进一步的了解。到目前为止,我已经将 UITableViewCell 子类化了。我创建了一个带有 UISegmentedControl 的笔尖,并将 UITableViewCell 背景 alpha 设置为 0。它看起来仍然不太正确,但比以前好多了。
我的解决方案是允许分段控件调整大小以适应,并将表格视图的背景隐藏在tableView:willDisplayCell:forRowAtIndexPath:
.
这会产生与“Settings.app > WiFi > Your Network > IP Address”分段控制相同的结果,而无需对任何布局指标进行硬编码:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:CellIdentifier] autorelease];
}
UISegmentedControl *control = [[UISegmentedControl alloc] initWithItems:[NSArray arrayWithObjects:@"One", @"Two", @"Three", nil]];
control.segmentedControlStyle = UISegmentedControlStylePlain;
control.autoresizingMask = (UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight);
control.frame = cell.contentView.bounds;
[cell.contentView addSubview:control];
[control release];
}
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
cell.backgroundView.alpha = 0.0;
}
诀窍似乎是将UISegmentedControl的大小调整backgroundView
为控件的大小,而不是contentView
. 我可以通过执行以下操作以编程方式做到这一点:
// Size to cover the entire background
self.contentView.frame = self.backgroundView.frame;
self.myControl.frame = self.contentView.bounds;
请注意,如果您使用的是配件,您也需要考虑到accessoryView
这一点。
原因是视图层次结构如下:
self
(UITableViewCell或子类)
backgroundView
contentView
accessoryView
在纵向布局中,backgroundView
' 框架是{{9, 0}, {302, 44}}
,而contentView
' 框架略小一些,位于{{10, 1}, {300, 42}}
。当表格样式被分组时,这会为单元格提供 1px 的“边框”。您必须调整contentView
和您的控件的大小以获得适当的大小。
(注意:虽然 Apple 实际上在SDK的UICatalog示例代码项目中有几个UISegmentedControl示例,但它们通过使用UIViewController并将主视图的背景颜色设置为表格背景颜色来有效地“作弊”。)