我无法获得字体大小。为什么我的字体等于零?
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kQuestionIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kQuestionIdentifier] autorelease];
}
cell.textLabel.text = [self extractText:indexPath forLabelAttribute:kTextLabel];
cell.textLabel.lineBreakMode = UILineBreakModeWordWrap;
cell.textLabel.numberOfLines = 0;
NSLog(@"______font family%@", cell.textLabel.font.familyName);
NSLog(@"______font name%@", cell.textLabel.font.fontName);
NSLog(@"______font size%f", cell.textLabel.font.pointSize);
并记录:
______font family.Helvetica NeueUI
______font name.HelveticaNeueUI-Bold
______font size0.000000
答案 0 :(得分:3)
在构建第一个表视图时,我注意到了这个问题。在我的情况下,后续视图不会出现此行为。换句话说,在tableView:cellForRowAtIndexPath:之后,对于第一个构建的表视图仅,字体显然已初始化。
解决此问题的一种方法是确保在单元格构造函数中正确初始化字体:
在类别中定义一个新的UITableViewCell构造函数,并为textLabel和detailTextLabel创建新的字体,并在调用super initWithStyle后选择默认值。
两种构建策略:
仅在受影响的表视图中使用此新构造函数,并生成 确保您的默认值与操作系统默认值一致。
或者用。替换所有UITableViewCell构造函数调用 这个新的构造函数可以确保所有表视图的一致性,以及 省略对pointSize的检查。我可能会支持这种策略,因为默认值可能会在未来的OS修订版中发生变化。
您可以使用此处列出的默认值作为参考。虽然,我认为自iOS 4.2以来它们已经发生了变化:Default font size of UITableViewCell
您也可以使用模拟器记录它们,以便在构建的第二个UITableView中自己发现它们。
示例代码:
单元格默认值:
#define kCellStyleSubtitleTextLabelFont @"Helvetica-Bold"
#define kCellStyleSubtitleTextLabelFontSize 18.0f
#define kCellStyleSubtitleDetailLabelFont @"Helvetica"
#define kCellStyleSubtitleDetailLabelFontSize 14.0f
#define kCellStyle1TextLabelFont @"Helvetica-Bold"
#define kCellStyle1TextLabelFontSize 17.0f
#define kCellStyle1DetailLabelFont @"Helvetica Bold"
#define kCellStyle1DetailLabelFontSize 15.0f
#define kCellStyle2TextLabelFont @"Helvetica-Bold"
#define kCellStyle2TextLabelFontSize 12.0f
#define kCellStyle2DetailLabelFont @"Helvetica"
#define kCellStyle2DetailLabelFontSize 15.0f
UITableViewCell类别:
@interface UITableViewCell (fontDefaults)
-(id) initWithCellStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;
@end
#define kCheckPointSize 0
@implementation UITableViewCell (fontDefaults)
-(id) initWithCellStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
self = [self initWithStyle:style reuseIdentifier:reuseIdentifier];
if(self == nil)
return nil;
switch (style) {
case UITableViewCellStyleValue1: { //Left aligned label on left and right aligned label on right with blue text (Used in Settings)
#if kCheckPointSize
if(self.textLabel.font.pointSize == 0)
#endif
self.textLabel.font = [UIFont fontWithName:kCellStyle1TextLabelFont size:kCellStyle1TextLabelFontSize];
#if kCheckPointSize
if(self.detailTextLabel.font.pointSize == 0)
#endif
self.detailTextLabel.font = [UIFont fontWithName:kCellStyle1DetailLabelFont size:kCellStyle1DetailLabelFontSize];
break;
}
case UITableViewCellStyleValue2: { //Right aligned label on left with blue text and left aligned label on right (Used in Phone/Contacts)
#if kCheckPointSize
if(self.textLabel.font.pointSize == 0)
#endif
self.textLabel.font = [UIFont fontWithName:kCellStyle2TextLabelFont size:kCellStyle2TextLabelFontSize];
#if kCheckPointSize
if(self.detailTextLabel.font.pointSize == 0)
#endif
self.detailTextLabel.font = [UIFont fontWithName:kCellStyle2DetailLabelFont size:kCellStyle2DetailLabelFontSize];
break;
}
case UITableViewCellStyleSubtitle: { //Left aligned label on top and left aligned label on bottom with gray text (Used in iPod).
#if kCheckPointSize
if(self.textLabel.font.pointSize == 0)
#endif
self.textLabel.font = [UIFont fontWithName:kCellStyleSubtitleTextLabelFont size:kCellStyleSubtitleTextLabelFontSize];
#if kCheckPointSize
if(self.detailTextLabel.font.pointSize == 0)
#endif
self.detailTextLabel.font = [UIFont fontWithName:kCellStyleSubtitleDetailLabelFont size:kCellStyleSubtitleDetailLabelFontSize];
break;
}
default: //default cell style
case UITableViewCellStyleDefault: { //Simple cell with text label and optional image view (behavior of UITableViewCell in iPhoneOS 2.x). No detailTextLabel
#if kCheckPointSize
if(self.textLabel.font.pointSize == 0) //
#endif
self.textLabel.font = [UIFont fontWithName:kCellStyle1TextLabelFont size:kCellStyle1TextLabelFontSize];
break;
}
}
return self;
}
@end
tableView中的示例构造:cellForRowAtIndexPath:
static NSString *CellIdentifier = @"Style2Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[[UITableViewCell alloc]
initWithCellStyle:UITableViewCellStyleValue2
reuseIdentifier:CellIdentifier] autorelease];
cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
cell.selectionStyle = UITableViewCellSelectionStyleNone;
}