2

私のコレクションビューのcellForItemAtIndexPathメソッドでNSMutableAttributedStringを作成しています。私はテキストに画像を埋め込むためにNSTextAttachmentを使用しています。cellForItemAtIndexPathにNSTextAttachmentを作成したNSMutableAttributedStringは、悪い考え方(パフォーマンスまたは設計上の問題)ですか?

は、これは悪い考えますか?現在、スクロールのパフォーマンスは良いようですが、より良い方法があるかどうかはわかりません。 NSMutableDictionaryのすべてのNSMutableAttributedStringをキャッシュすると、2番目のスクロールには向いていますか?

同じ質問があまりにもcellForRowAtIndexPathを使用してUITableviewに適用することができます。

コード:テーブルビューまたはコレクションビューがロードされる前に、一般的なルールとして

- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { 
    CellView *cell = [collectionView dequeueReusableCellWithReuseIdentifier:[CellView reuseIdentifier] forIndexPath:indexPath]; 

    NSTextAttachment *attachment = [[NSTextAttachment alloc] init]; 
    attachment.image = [UIImage imageNamed:@"eye"]; 
    attachment.bounds = CGRectMake(0, -2.5, 14,14); 
    NSAttributedString *attachmentString = [NSAttributedString attributedStringWithAttachment:attachment]; 

    NSMutableAttributedString *myString= [[NSMutableAttributedString alloc] initWithString:@""]; 
    [myString appendAttributedString:attachmentString]; 

    [myString appendAttributedString:[[NSMutableAttributedString alloc] initWithString:@" 19K "]]; 

    NSTextAttachment *attachment2 = [[NSTextAttachment alloc] init]; 
    attachment2.image = [UIImage imageNamed:@"heart"]; 
    attachment2.bounds = CGRectMake(0, -2.5, 14,14); 
    NSAttributedString *attachmentString2 = [NSAttributedString attributedStringWithAttachment:attachment2]; 

    [myString appendAttributedString:attachmentString2]; 

    [myString appendAttributedString:[[NSMutableAttributedString alloc] initWithString:@" 13K "]]; 

    [myString enumerateAttribute:NSFontAttributeName inRange:(NSRange){0,[myString length]} options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id value, NSRange range, BOOL *stop) { 
     [myString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"AvenirNext-Medium" size:12] range:range]; 
     [myString addAttribute:NSForegroundColorAttributeName value:[UIColor colorWithWhite:1 alpha:1] range:range]; 
    }]; 



    NSMutableAttributedString *titletext= [[NSMutableAttributedString alloc] initWithString:[self checkIfBig:indexPath]?[NSString stringWithFormat:@"\nThe Underground Railway"]:[NSString stringWithFormat:@"\nPink Oasis"]]; 

    [titletext enumerateAttribute:NSFontAttributeName inRange:(NSRange){0,[titletext length]} options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id value, NSRange range, BOOL *stop) { 
     [titletext addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"AvenirNext-Medium" size:24] range:range]; 
     [titletext addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:range]; 
    }]; 

    [myString appendAttributedString:titletext]; 

    if ([self checkIfBig:indexPath]){ 
     NSMutableAttributedString *subtitletext= [[NSMutableAttributedString alloc] initWithString:@"\nLorem Ipsum is simply dummy text of the printing and typesetting industry."]; 

     [subtitletext enumerateAttribute:NSFontAttributeName inRange:(NSRange){0,[subtitletext length]} options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id value, NSRange range, BOOL *stop) { 
      [subtitletext addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"AvenirNext-Medium" size:14] range:range]; 
      [subtitletext addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:range]; 
     }]; 
     [myString appendAttributedString:subtitletext]; 
    }; 

    if ([self checkIfBig:indexPath]){ 
     NSMutableAttributedString *subtitletext= [[NSMutableAttributedString alloc] initWithString:@"\n\n#HORROR #BLOOD"]; 

     [subtitletext enumerateAttribute:NSFontAttributeName inRange:(NSRange){0,[subtitletext length]} options:NSAttributedStringEnumerationLongestEffectiveRangeNotRequired usingBlock:^(id value, NSRange range, BOOL *stop) { 
      [subtitletext addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"AvenirNext-MediumItalic" size:14] range:range]; 
      [subtitletext addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:range]; 
     }]; 
     [myString appendAttributedString:subtitletext]; 
    }; 

    cell.titleLabel.attributedText=myString; 


    return cell; 
} 
+0

クラスファイル内の1つの関数を作成し、単にあなたがtableviewcellrowatindexメソッド素晴らしい –

答えて

2

、あなたのデータは、一旦組み立てする必要があります。現在のコードでは、ユーザーが前後にスクロールすると、同じデータを何度も何度も再作成しています。それはかなり非効率的です。 (あなたが複数のセクションを持っている場合、または配列の配列)

あなたのデータのすべてが単一のアレイにする必要があります。 cellForRow|ItemAtIndexPathは配列からオブジェクトを取得するだけで、そのオブジェクトのプロパティを使用してセルを設定する必要があります。

あなたは多くの行を持っているか、データの一部は、より高価である場合は、オンデマンドで特定のデータ要素を作成し、あなたはまだ一度だけ1を作成するように、それらをキャッシュすることにより、上記のを向上させることができます。正常に完了したら

することは、あなたの質問でcellForItemAtIndexPathは、コードの5行未満でなければなりません。

+0

にこの全体のコードを書いている理由を使用するようにそれを呼び出すと、その非常に簡単なようにデータを渡す、ありがとうございました!ですから 'cellForRowItemAtIndexPath'が呼び出される前にすべての' NSMutableAttributedString'を事前に作成する必要があります。 –

+0

それから始め、あなたのパフォーマンスがどのようになっているかを見てください。最初の作成に時間がかかり過ぎると、そのアプローチを改善する方法があります。 – rmaddy

+0

すごく、ありがとう! –

関連する問題