我正在制作一个应用程序,每个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;
}
答案 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);
}