7

我正在尝试UISegmentedControl在一个组中加入一个UITableViewCell,就像在设置应用程序中的 wifi 设置中一样。我遇到的问题是我得到了双边框。我得到一个边框,一个UISegmentedControl边框UITableViewCell

我猜我需要从UITableViewCell. 我该怎么做呢?

4

6 回答 6

7

我只是注意到这仍在得到答案。碰巧我不得不为另一个项目做这件事,自从我问了这个问题以来,我学到了更多关于 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];
于 2009-12-28T14:08:16.010 回答
3

在 Wi-Fi 设置的情况下,我怀疑他们所做的是让“忘记此网络”按钮、“IP 地址”标签和“DHCP/BootP/Static”分段控制表的所有部分标题视图。如果您需要在表格中间执行此操作(而不是在顶部或底部,您将分别使用tableHeaderViewtableFooterView属性),我建议使用委托方法-tableView:viewForHeaderInSection:with-tableView:heightForHeaderInSection或相应的Footer变体。使用其中任何一个,您将为表格视图的“部分”设置一个自定义视图(使用清晰的背景颜色或[UIColor groupTableBackgroundColor]),其中包含一个标签和一个分段控件,以便它们与其余部分匹配表部分。

于 2009-12-25T00:49:45.533 回答
2

使用这篇文章中的技术来删除 UITableViewCell 的背景不透明度对我来说更容易让 UISegmentedControl 只显示在表格行中。

于 2011-12-14T18:25:41.253 回答
1

我对此有了更进一步的了解。到目前为止,我已经将 UITableViewCell 子类化了。我创建了一个带有 UISegmentedControl 的笔尖,并将 UITableViewCell 背景 alpha 设置为 0。它看起来仍然不太正确,但比以前好多了。

于 2009-05-22T13:06:03.087 回答
1

我的解决方案是允许分段控件调整大小以适应,并将表格视图的背景隐藏在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;
}
于 2012-03-29T11:31:29.543 回答
0

诀窍似乎是将UISegmentedControl的大小调整backgroundView为控件的大小,而不是contentView. 我可以通过执行以下操作以编程方式做到这一点:

    // Size to cover the entire background
    self.contentView.frame = self.backgroundView.frame;
    self.myControl.frame = self.contentView.bounds;

请注意,如果您使用的是配件,您也需要考虑到accessoryView这一点。

原因是视图层次结构如下:

  • selfUITableViewCell或子类)
    • backgroundView
    • contentView
      • (你的控制在这里)
    • accessoryView

在纵向布局中,backgroundView' 框架是{{9, 0}, {302, 44}},而contentView' 框架略小一些,位于{{10, 1}, {300, 42}}。当表格样式被分组时,这会为单元格提供 1px 的“边框”。您必须调整contentView 您的控件的大小以获得适当的大小。

(注意:虽然 Apple 实际上在SDKUICatalog示例代码项目中有几个UISegmentedControl示例,但它们通过使用UIViewController并将主视图的背景颜色设置为表格背景颜色来有效地“作弊”。)

于 2009-12-24T23:56:23.820 回答