UILabel归因于文本渲染不正确

时间:2014-09-29 03:48:08

标签: ios objective-c uilabel nsattributedstring

我一直在使用属性文本设置UILabel来获取我想要的字体大纲,并且我经常更改UILabel的attributionText属性。似乎大约50%的时间似乎在不删除旧文本的情况下将旧文本呈现在旧文本上。现在我的代码看起来像这样:

// Attributes initialization
self.labelAttributes = [NSMutableDictionary dictionary];
[self.labelAttributes setObject: [UIFont fontWithName:@"Helvetica Neue" size:21] forKey: NSFontAttributeName];
[self.labelAttributes setObject: [UIColor whiteColor] forKey: NSForegroundColorAttributeName];
[self.labelAttributes setObject: [NSNumber numberWithFloat: -3.0] forKey: NSStrokeWidthAttributeName];
[self.labelAttributes setObject: [UIColor blackColor] forKey: NSStrokeColorAttributeName];

// Clear UILabel attributedString
self.userLabel.attributedText = [[NSAttributedString alloc] initWithString:@"" attributes:self.labelAttributes];
// Also attempted this with nil;


// Set UILabel to string, where self.userName and self.userAge are just regular strings. 
NSString *labelString = [NSString stringWithFormat:@"%@, %@", self.userName, self.userAge];
self.userLabel.attributedText = [[NSAttributedString alloc] initWithString:labelString attributes:self.labelAttributes];

当它工作时,它看起来像这样:

enter image description here

当它不起作用时,它看起来像这样:

enter image description here

这似乎是最后一个用户的名字,加上当前用户的名字叠加在一起。

我无法找到一种保证标签被清除的好方法,并且不确定如何调试它。 (我尝试在XCode 6中使用可视化调试,但它仍然认为它只是一个标签,新用户的文本作为文本属性。)

5 个答案:

答案 0 :(得分:3)

默认情况下它应该是正确的,但无论如何你都可以尝试:

self.userLabel.clearsContextBeforeDrawing = YES;
self.userLabel.contentMode = UIViewContentModeRedraw;

答案 1 :(得分:2)

有趣。不知道为什么那不起作用。你的代码似乎很好。我唯一能想到的是,如果这是一个表视图单元格中的标签,它是在屏幕外然后在屏幕上重置的?否则,不知道。

这是做同样事情的另一种方式,对我有用。

NSString *labelString = [NSString stringWithFormat:@"%@, %@", self.userName, self.userAge];
self.userLabel.text = labelString;
NSMutableAttributedString *attStr = [[NSMutableAttributedString alloc]initWithAttributedString:self.userLabel.attributedText];
[attStr addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica Neue" size:21] range:NSMakeRange(0, self.userLabel.length)];
[attStr addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(0, self.userLabel.length)];
[attStr addAttribute:NSStrokeWidthAttributeName value:[NSNumber numberWithFloat:-3.0f] range:NSMakeRange(0, self.userLabel.length)];
[attStr addAttribute:NSStrokeColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, self.userLabel.length)];
//or 1 liner
//[attStr addAttributes:[NSDictionary dictionaryWithObjectsAndKeys:[UIFont fontWithName:@"Helvetica Neue" size:21], NSFontAttributeName, [UIColor whiteColor], NSForegroundColorAttributeName, [NSNumber numberWithFloat:-3.0f], NSStrokeWidthAttributeName, [UIColor blackColor], NSStrokeColorAttributeName, nil] range:NSMakeRange(0, self.userLabel.length)];
[self.userLabel setAttributedText:attStr];

此外,我不明白为什么你不能设置标签以开始这些属性,(如果它们没有在整个标签中改变)。 你可以这么做:

NSString *labelString = [NSString stringWithFormat:@"%@, %@", self.userName, self.userAge];
self.userLabel.text = labelString;
self.userLabel.font = [UIFont fontWithName:@"Helvetica Neue" size:21];
self.userLabel.textColor = [UIColor blackColor];
//Then set the stroke with one attribute

希望这有帮助!快乐的编码。

答案 2 :(得分:2)

您可以按照以下方式执行此操作:

self.userLabel.attributedText = [[NSAttributedString alloc] 
initWithString:@"string to both stroke and fill" 
attributes:@{
             NSStrokeWidthAttributeName: [NSNumber numberWithFloat:-3.0],
             NSStrokeColorAttributeName: [UIColor blackColor],
             NSForegroundColorAttributeName: [UIColor whiteColor]
             }
];

答案 3 :(得分:1)

我认为我之前已经看到过UITableCell重用和运行时确定的动态表格单元格高度。如果我没记错的话,当单元格被设置为高度0时会发生这种情况。

如果你在上面的场景中,请尝试在UITableViewCell或最顶层的重用视图上将clipsToBounds设置为on。当包含视图的帧大小或高度设置为零时,启用clipsToBounds会导致标签等不会流出视图。

答案 4 :(得分:1)

我怀疑问题与归因文本无关。我怀疑问题是你在重用的UITableViewCell中添加了一个新的UILabel,而不是重用旧的UILabel。