編集: NSAttributedString、OHAttributedLabel、または TTTAttributedLabel とは関係ありません!
簡単な質問:同じ問題でUILabel、 OHAttributedLabel、または TTTAttributedLabel を使用しています。テーブル ビューをスクロールすると、ラベルの表示が台無しになります。詳細については、以下をご覧ください...
長い形式: ツイートのテキストを表す NSAttributedString オブジェクトがあります。ツイートのさまざまなコンテンツに基づいて文字列を装飾しました (たとえば、ハッシュタグは青色、URL は緑色で下線付き、ユーザーのメンションは赤色)。
例えばこんなツイート。
@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 で同じであるため) が、その理由はわかりません。(私がまだ試していないことの 1 つは、プレーン テキストとツイート コンテンツのプレーン UILabel です。これは今夜のリストにあります。わかりました、UILabel とプレーン テキスト コンテンツと同じ動作です。私は何を間違っていますか??? )
tableView:cellForRowAtIndexPath:、tableView:heightForRowAtIndexPath:、および tableView:didSelectRowAtIndexPath:; のコードは次のとおりです。このコードは、UITableViewController のサブクラスではなく、UIViewController サブクラスにあることに注意してください。
-(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 は、4 つのオブジェクトを含む UITableViewCell のサブクラスです: アバター用の UIImageView、送信者のスクリーン名用の UILabel、送信された時間用の UILabel、およびツイート コンテンツ用の「ラベル」オブジェクト。上で述べたように、OHAttributedLabel と TTTAttributedLabel を試しましたが、動作は同じです。
悪いスクロール:
- テキストとスクリーン名の間のすべての空白は奇妙です。
選択中:
- ポジショニングがどのように固定されているかを確認する