我一直在使用属性文本设置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];
当它工作时,它看起来像这样:
当它不起作用时,它看起来像这样:
这似乎是最后一个用户的名字,加上当前用户的名字叠加在一起。
我无法找到一种保证标签被清除的好方法,并且不确定如何调试它。 (我尝试在XCode 6中使用可视化调试,但它仍然认为它只是一个标签,新用户的文本作为文本属性。)
答案 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。