当我将UIViewController推送到我的UINavigation控制器上时,如:
[(UINavigationController *)self.parentViewController pushViewController:[[[Fonts alloc] initWithNibName:@"Fonts" bundle:nil] autorelease] animated:YES];
其中Fonts.xib是一个UIView,只有UITableView由一个Fonts对象控制,该对象是UIViewController的子类,并充当UITableView的dataSource和delegate。
在Fonts对象中,我创建了一个UITableViewCell,如:
- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath {
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier: @"BlahTableViewCell"];
if (!cell) {
cell = [[UITableViewCell alloc]
initWithStyle: UITableViewCellStyleDefault
reuseIdentifier: @"BlahTableViewCell"];
[cell autorelease]; // Delete for ARC
}
return cell;
}
然后我在这里改变单元格的字体:
- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
[cell.textLabel setFont:[(UIFont *)[self.listOfFonts objectAtIndex:indexPath.row] fontWithSize:cell.textLabel.font.pointSize]];
cell.textLabel.text = [(UIFont *)[self.listOfFonts objectAtIndex:indexPath.row] fontName];
}
listOfFonts是UIFont对象的NSArray。
当视图显示时,它看起来像UITableView without changed fonts
如果我在UITableView上调用reloadData,或者如果我用手指将UITableViewCells拖出屏幕并让它们反弹,则会重新绘制它们,并且单元格显示的视图中的字体会更改字体。
似乎问题是UITableViewCells被过早绘制。如果我延迟绘制它们的一切看起来都正确但我希望UINavigationController在UINavigationController将我的视图滑动到位时正确显示。
知道我做错了吗?
编辑:我向Dropbox上传了一个简单直接的问题示例。 http://dl.dropbox.com/u/5535847/UITableViewIssue.zip
答案 0 :(得分:4)
解决了!
好的,所以我遇到了与原始海报完全相同的问题,这就是问题所在。
造成问题的一行是:
[cell.textLabel setFont:[(UIFont *)[self.listOfFonts objectAtIndex:indexPath.row] fontWithSize:cell.textLabel.font.pointSize]];
具体来说,你的问题是因为你试图将单元格的textLabel提供给它自己的pointSize,但是pointSize还不存在,所以会发生奇怪的错误。对我来说,我注意到由于奇异矩阵是不可逆的,“变换”失败了。一旦我将标准值硬编码为我的pointSize,我就立刻看到所有标签都用正确的字体绘制。注意:这对于重绘的原因是有意义的,因为那时你的textLabel确实有一个pointSize。
在任何情况下,你需要在这里明确设置你的pointSize,不要使用textLabel“已经拥有”的内容,因为在你“重新加载”一个单元格之前它没有任何东西。
答案 1 :(得分:2)
在-tableView:cellForRowAtIndexPath:
内设置标签字体。
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
static NSString *identifier = @"identifier";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier] autorelease];
// do it here if your font doesn't change ....
}
// otherwise here with your font ...
cell.textLabel.font = [UIFont boldSystemFontOfSize:12];
return cell;
}
答案 2 :(得分:0)
我不确定表格单元格是否可以通过这种方式进行自定义。表格单元格可能假设您不会自定义字体,因此不能以与您尝试的方式兼容的方式绘制自己。
最好创建一个自定义表格单元格,或者在创建表格单元格时将UILabel作为子视图附加到表格单元格中,然后设置该标签的字体。
对于如此小的定制而言似乎有些过分,但它很灵活且保证可以正常工作。