UITableViewCell / UISegmentedControl边界问题

时间:2009-05-22 10:48:33

标签: iphone objective-c uikit uitableview uisegmentedcontrol

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

我猜我需要从UITableViewCell删除边框。我怎么能这样做?

6 个答案:

答案 0 :(得分: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];

答案 1 :(得分:3)

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

答案 2 :(得分:2)

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

我的解决方案是允许分段控件调整大小以适应,并在tableView:willDisplayCell:forRowAtIndexPath:中隐藏表格视图的背景。

这会产生与“Settings.app> WiFi>您的网络> IP地址”分段控制相同的结果,而无需对任何布局指标进行硬编码:

- (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;
}

答案 5 :(得分: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实际上在UISegmentedControlUICatalog示例代码项目中有几个the SDK的示例,但他们通过使用UIViewController来有效地“欺骗”将主视图的背景颜色设置为表格背景颜色。)