0

編集: 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 を試しましたが、動作は同じです。

悪いスクロール:

奇妙な巻物

  • テキストとスクリーン名の間のすべての空白は奇妙です。

選択中:

選択により固定

  • ポジショニングがどのように固定されているかを確認する
4

1 に答える 1

1

解決済み - パイロット エラー。問題は、スプリング/ストラットの邪悪な陰謀と、ラベルのサイズの設定方法でした。

上記の tableView:heightForRowAtIndexPath: のコードは意図したとおりに機能します。結果の動作に影響を与える 2 つの変更を加えました。

  1. tweetTextLabel の高さを設定するコードを tableView:cellForRowAtIndexPath: に追加しました。

    CGRect rect = cell.tweetTextLabel.frame;
    rect.size.height = [self.model heightForTweetAtIndexPath:indexPath
                                                  usingWidth:label_width];
    cell.tweetTextLabel.frame = rect;
    
  2. tweetTextLabel (IB) の垂直スプリングと同様に、右と下のストラットをオフにしました。

これら 2 つの変更により、最初のプレゼンテーションとスクロールが正しく動作するようになりました。

于 2012-10-26T22:42:31.860 に答える