4

リンク、プレーンテキスト、およびフォーマットされた単語の組み合わせを含む複数行のテキストをエレガントに実現するにはどうすればよいですか?今のところ、私が考えることができるのは、各単語をトークンに分割し、それを異なる方法(UILabel、UIButtonなど)で表示/配置することだけですが、これはひどく非効率的です。これは私がInstagramのコメント機能から達成しようとしていることの例です。

Instagramのコメント

ユーザー名へのフォーマットされたリンク、インデントされた複数行のテキスト、およびハッシュタグへのインラインリンクの可能性に注意してください。

4

2 に答える 2

3

9月14日編集

そのため、 FTCoreTextViewを使用して非常によく似たものを実装できました 。インポート/実装は簡単でした。ARCプロジェクトで静的ライブラリとしてコードを使用しています。

コアコンポーネントは次のとおりです。

  • セルのスタイルを設定するメソッドを使用しますFTCoreTextView

     (NSArray *)getCoreTextStyle{
        NSMutableArray *result = [NSMutableArray array];
    
        FTCoreTextStyle *defaultStyle = [FTCoreTextStyle new];
       defaultStyle.name = FTCoreTextTagDefault;    //though the default name is already set to FTCoreTextTagDefault
       defaultStyle.font = [UIFont fontWithName:@"Helvetica Neue" size:14.f];
       defaultStyle.textAlignment = FTCoreTextAlignementLeft;
       [result addObject:defaultStyle];
    
    
           FTCoreTextStyle *linkStyle = [defaultStyle copy];
       linkStyle.name = FTCoreTextTagLink;
       linkStyle.color = [UIColor blueColor];//[del colorWithHexString:@"3aa98"];
           linkStyle.font = [UIFont fontWithName:@"Helvetica Neue" size:14.f];
        [result addObject:linkStyle];
    
            return  result;
     }
    
  • 次に、セルでビューのテキストを設定したり、デリゲートを割り当てたりします(MyFTCoreTextViewはプレーンIBOutletをオーバーライドしますUIView

    [myFTTView setDelegate:self];
    [myFTTView addStyles:[self getCoreTextStyle]];
    [myFTTView setText:[self parseLinks:text]];
    [myFTTView setNeedsDisplay];
    
  • リンクの解析は、ハッシュタグとユーザー名を検索し、見つかったときにスタイルを設定するために個別に定義する方法です(このコードは大まかなものであり、多くの改善が必要です。ハッシュタグと@のコード検索が既に行われているCoreTextHyperlinkへの切り替えを検討しています。ユーザー名。)

    -(NSString *) parseLinks: (NSString *)cap{
       NSArray *split = [cap componentsSeparatedByString:@" "];
       NSMutableArray *words = [[NSMutableArray alloc] initWithArray:split];
    
          for (NSString *word in split){
    
             if([word hasPrefix:@"#"] || [word hasPrefix:@"@"]){
    
                NSString *reformat = [NSString stringWithFormat:@"%@%@|%@%@", hashlink,word, word, endhashlink];
                [words replaceObjectAtIndex:[split indexOfObject:word] withObject:reformat];
            }
    
        }
        return [words componentsJoinedByString:@" "];
    }
    
  • 最後になりましたが、タグ/ユーザー名がクリックされた後に呼び出されるメソッド

    - (void)coreTextView:(FTCoreTextView *)acoreTextView receivedTouchOnData:(NSDictionary *)data {
    
        NSString *key = [data objectForKey:@"url"];
        if([key hasPrefix:@"#"]){
           //do something for tag
        }
       else{
          //do something for user.
       }
    
       return;
    
       }
    
于 2012-09-21T17:59:12.183 に答える
1

私が考えることができる2つの方法:

  • sでCoreTextを使用しますNSAttributedString。特にリンクの場合(リスナーをどこかに登録し、「クリック」した「リンク」を計算する必要があります...)、達成するのは困難ですが、最高のパフォーマンスを提供します。
  • を使用しUIWebViewて、HTMLをオンザフライで記述します。パフォーマンスは低下しますが、柔軟性ははるかに高くなります。
于 2012-09-09T12:38:19.610 に答える