编辑:与NSAttributedString,OHAttributedLabel或TTTAttributedLabel无关!
简短的问题:我正在使用 UILabel, OHAttributedLabel或TTTAttributedLabel同样的问题 - 滚动表视图会搞砸标签的显示。更多关于以下内容......
长篇: 我有一个NSAttributedString对象,表示来自推文的文本。我根据推文中的各种内容装饰了字符串(例如,主题标签为蓝色,网址为绿色,下划线,用户提及红色)。
例如,这条推文:
@MeetGreen Keep up the good work. Say Hi to Nancy for me - she convinced me that I can be green and save green at the same time!
导致这个NSAttributedString :(使用我编写的实用程序显示,以帮助我看到发生了什么):
@MeetGreen{
NSColor = "UIDeviceRGBColorSpace 1 0 0 1";
NSFont = "<UICFFont: 0x93c57d0> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 17px";
} Keep up the good work. Say Hi to Nancy for me - she convinced me that I can be green and save green at the same time!{
CTForegroundColor = "<CGColor 0x93c8f20> [<CGColorSpace 0x938b570> (kCGColorSpaceDeviceGray)] ( 0 1 )";
NSFont = "<UICFFont: 0x93c57d0> font-family: \"Helvetica\"; font-weight: normal; font-style: normal; font-size: 17px";
}
生成NSAttributedString对象的代码似乎正在执行我想要的操作,但是当我尝试在UILabel(或TTTAttributedLabel或OHAttributedLabel)中显示此对象时,我无法说服它正常工作。主要问题似乎是滚动行为 - 单元格没有正确绘制(文本处于某种奇怪的位置)。但是,如果我只是选择单元格(例如,通过触摸它),则会按照应有的格式绘制单元格。这让我觉得问题在于我的委托方法中的表滚动处理而不是属性标签本身(因为OHAttributedLabel和TTTAttributedLabel的行为是相同的),但我不确定为什么。 (我还没有尝试过的一件事是纯文本和普通UILabel的推文内容 - 今晚就在列表中。好的,与UILabel和纯文本内容相同的行为。我做错了什么? )
这是我的tableView代码:cellForRowAtIndexPath:,tableView:heightForRowAtIndexPath:和tableView:didSelectRowAtIndexPath:;请注意,此代码驻留在UIViewController子类中,而不是UITableViewController的子类。
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
TweetingTweetCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Tweet"];
TSTweet *tweet = [self.model tweetAtIndexPath:indexPath];
cell.userHandleLabel.text = tweet.user.screenName;
cell.userNameLabel.text = tweet.user.name;
cell.timestampLabel.text = timeStamp;
cell.tweetTextLabel.attributedText = [self.model decoratedStringForTweetAtIndexPath:indexPath];
UIImage *image = [UIImage imageNamed:@"avatar"];
cell.userImage.image = image;
return cell;
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
CGFloat tweetHeight = [self.model heightForTweetAtIndexPath:indexPath
usingWidth:label_width];
CGFloat height = tweetHeight + label_headroom + label_footroom;
CGFloat result = MAX(height,defaultHeight);
NSLog(@"[%@ %@] %@ (%@)\ntweetHeight=%f, height=%f, defaultHeight=%f, result=%f", NSStringFromClass([self class]), NSStringFromSelector(_cmd),indexPath,[self.model decoratedStringForTweetAtIndexPath:indexPath].string,tweetHeight,height,defaultHeight,result);
return result;
}
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"[%@ %@] indexPath=%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd),indexPath);
TweetingTweetCell *cell = (TweetingTweetCell *)[tableView cellForRowAtIndexPath:indexPath];
NSLog(@"decoratedString=%@",[self.model decoratedStringForTweetAtIndexPath:indexPath]);
[cell dumpDebugInfo];
[tableView deselectRowAtIndexPath:indexPath
animated:NO];
}
TweetingTweetCell是UITableViewCell的子类,包含4个对象:用于头像的UIImageView,用于发送者屏幕名称的UILabel,用于发送时间的UILabel,以及用于推文内容的“标签”对象。正如我上面所说,我尝试过OHAttributedLabel和TTTAttributedLabel,行为也一样。
错误滚动:
在选择期间:
答案 0 :(得分:1)
已解决 - 飞行员错误。问题是弹簧/支柱的邪恶阴谋以及我如何设定标签的大小。
上面提到的tableView:heightForRowAtIndexPath的代码按预期工作。我做了两个改变,影响了最终的行为:
我在tableView:cellForRowAtIndexPath:中添加了代码来设置tweetTextLabel的高度,即:
CGRect rect = cell.tweetTextLabel.frame;
rect.size.height = [self.model heightForTweetAtIndexPath:indexPath
usingWidth:label_width];
cell.tweetTextLabel.frame = rect;
我在tweetTextLabel(在IB中)关闭了右侧和底部支柱以及垂直弹簧。
这两项更改使初始演示和滚动行为正确。