UITableViewCell子类,如何绘制按钮?

时间:2011-08-21 15:28:47

标签: iphone objective-c ios uitableview

我正在制作一个应用程序,每个tableview单元格中需要三个按钮。我尝试使用addSubview中的cellForRowAtIndexPath:将按钮添加到单元格,但这会导致慢速/轻快滚动超过6或7行。

我在网上进行了一些研究,并且遵循了Apple的子类化UITableViewCell并在drawRect中绘制所有内容的示例。我可以使用drawAtPoint完美地绘制文本和图像,但这似乎不适用于UIButtons。

将按钮添加为[self contentView]的子视图(在我的子类drawRect中)只会导致比以前更糟的滚动延迟。

有没有人知道如何在我的UITableViewCell子类中正确绘制按钮?

正确使用这对整个应用程序至关重要,因此非常感谢任何帮助!

更新:以下是用于tableView:cellForRowAtIndexPath

的代码
static NSString *CellIdentifier = @"CustomCell";

AHCustomCell * cell = (AHCustomCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (cell == nil) {
    AHCustomCell * customCell = [[[AHCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    customCell.frame = CGRectMake(0.0, 0.0, 320.0, 55.0);
    cell = customCell;
}

3 个答案:

答案 0 :(得分:1)

以下代码提供了三个按钮,没有锯齿状滚动。使用标签,您可以根据行重置按钮的文本。按钮1(根据行号调整其标题)说明了这一点。图示的button1Pressed:方法计算出按钮按下的行。希望这会有所帮助。

- (UITableViewCell *)tableView:(UITableView*)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString* cellIdentifier = @"Cell";

    // see if there's a cell available to recylce
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    if (!cell)
    {
        // there's no cell to recycle, so make a new one
        // add three buttons to it and tag them so we can alter their contents later

        cell = [[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:cellIdentifier];

        UIButton* button1 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button1 setTitle:@"Button 1" forState:UIControlStateNormal];
        [button1 setFrame:CGRectMake(4.0, 15.0, 110, 30.0)];
        [button1 setTag:101];
        [button1 addTarget:self action:@selector(button1Pressed:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:button1];

        UIButton* button2 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button2 setTitle:@"Button 2" forState:UIControlStateNormal];
        [button2 setFrame:CGRectMake(120.0, 15.0, 80.0, 30.0)];
        [button2 setTag:102];
        [button1 addTarget:self action:@selector(button2Pressed:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:button2];

        UIButton* button3 = [UIButton buttonWithType:UIButtonTypeRoundedRect];
        [button3 setTitle:@"Button 3" forState:UIControlStateNormal];
        [button3 setFrame:CGRectMake(210, 15.0, 80.0, 30.0)];
        [button3 setTag:103];
        [button3 addTarget:self action:@selector(button3Pressed:) forControlEvents:UIControlEventTouchUpInside];
        [[cell contentView] addSubview:button3];

    }

    // either on a recycled cell or on the cell just created, set the contents

    UIButton* button1 = (UIButton*)[[cell contentView] viewWithTag:101];
    [button1 setTitle: [NSString stringWithFormat:@"Button 1 - %d", [indexPath row]] forState:UIControlStateNormal];

    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    return cell;
}



- (void) button1Pressed: (UIButton*) button
{
   CGPoint buttonCentre = [button convertPoint:[button center] toView:[self tableView]];

    NSLog(@"Button 1 Pressed on row %d", [[[self tableView] indexPathForRowAtPoint:buttonCentre] row]);
}

答案 1 :(得分:0)

如果所有的UITableViewCell都是相同的格式,只有不同的信息,我建议创建一个UITableViewCell的子类,它知道如何使用某种Model对象格式化单元格,并且连接到它自己的nib。这样,您就可以在cellForRowAtIndexPath:方法中轻松加载新单元格,并且可以显着加快您的应用。更改自定义单元格也更容易,并且更容易实现。网上有很多关于如何做到这一点的教程。 Here是我刚刚在Google上找到的。希望有所帮助!

答案 2 :(得分:0)

你无法在-drawRect:中真正绘制UIButton,除非你真的从头开始创建一个按钮(即不使用UIButton类)。但是,您可以在-drawRect中更改UIButton的框架。您可能需要在-setNeedsDisplay方法中调用-tableView:cellForRowAtIndexPath:来强制drawRect:执行。

UITableViewCell子类的代码如下所示:

@synthesize button = _button;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier
{
   self = [super initWithStyle:style reuseIdentifier:reuseIdentifier];
   if (self) 
   {         
      _button = [[UIButton buttonWithType:UIButtonTypeRoundedRect] retain];
      [self.contentView addSubview:_button];
   }
   return self;
}

- (void)dealloc 
{
    [_button release];
    [super dealloc];    
}

- (void)drawRect:(CGRect)frame
{   
    _button.frame = CGRectMake(20.0f, 5.0f, 100.0f, 30.0f);
}