在运行时期间无法在自定义UITableViewCell中更改和自定义UIButtons的标题

时间:2013-11-16 00:55:38

标签: ios cocoa-touch uitableview uibutton

我创建了一个包含四个UITableViewCell的自定义UIButtons。这些按钮的文本(titleLabel)是根据单元格的索引生成的。我正在使用以下内容自定义tableView:cellForRowAtIndexPath中的每个按钮(answer1是UIButton)...

NSLog(@"Default button title: %@", myCustomCell.answer1.titleLabel.text);
[myCustomCell.answer1 setTitle:selectedQuestion.possibleAnswers[0] forState:UIControlStateNormal];
myCustomCell.answer1.titleLabel.textAlignment = NSTextAlignmentCenter;
NSLog(@"New button title: %@", myCustomCell.answer1.titleLabel.text);
[myCustomCell.answer1 adjustTitleFontSizeToFit];

预期产出:

Default button title: Answer 1
New button title: *ANSWER TEXT HERE*

但是实际的控制台输出显示字符串没有更新,但在设备上它是正确的字符串。但是,它有时会更改标题,但只会更改我创建的第一个按钮(我在每个按钮上使用相同的代码)。

我使用UIButton方法创建了一个adjustTitleFontSizeToFit类别,因为如果字符串不适合按钮框架,我希望每个按钮的titleLabel自动调整字体大小。在此示例之外测试此方法时,它按预期工作。问题似乎是按钮的titleLabel没有及时更新adjustTitleFontSizeToFit来完成它的工作。换句话说,当按钮上调用adjustTitleFontSizeToFit时,它操作的字符串是我创建按钮时xib中的默认字符串。 NSLog之后的setTitle:forState:也会显示此信息。

奇怪的行为(对我来说很奇怪)是在应用程序中,它实际上确实改变了标题。我只需要能够在单元格构建期间处理titleLabel,这样我就可以调整按钮标签的大小。

非常感谢任何想法,如果需要,我可以提供更多信息。

1 个答案:

答案 0 :(得分:0)

与许多UI错误一样,问题是我的xib / storyboard中遗漏了一个简单的复选标记。我将第一个按钮设置为“自定义”按钮类型,其余按钮设置为系统“按钮”类型。

Set the button type!

赠送应该是它只为一个按钮工作,而不是其他按钮。但如果有人遇到类似的问题,我会把它留下来。

如果有人需要调整UIButton的字体大小,这里是我使用的类别方法......

- (void)adjustTitleFontSizeToFit
{   
    UIFont *font = self.titleLabel.font;
    CGSize size = self.frame.size;

    for (CGFloat maxSize = self.titleLabel.font.pointSize; maxSize >= self.titleLabel.minimumScaleFactor * self.titleLabel.font.pointSize; maxSize -= 1.f) {
        font = [font fontWithSize:maxSize];
        CGSize constraintSize = CGSizeMake(size.width, MAXFLOAT);
        CGSize labelSize = [self.titleLabel.text sizeWithFont:font constrainedToSize:constraintSize lineBreakMode:NSLineBreakByWordWrapping];

        if(labelSize.height <= size.height) {
            self.titleLabel.font = font;
            [self setNeedsLayout];
            break;
        }
    }

    // set the font to the minimum size anyway
    self.titleLabel.font = font;
    [self setNeedsLayout];
}