2013-06-28 11 views
5

私はtableviewセルでラベルを使用しています。セルに属性付き文字列が割り当てられていますが、選択したセルテキストが属性付き文字列で白くならないという問題があります。NSAttributedStringを使用してUILabelのハイライトされたテキストの色を設定します。

これを修正する方法はありますか?

何か助けていただければ幸いです。

ここに私のコードを見ています。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    LHSearchViewCell *cell = [LHSearchViewCell cellForTableView:tableView fromNib:_cellNib]; 

    cell.selectionStyle = UITableViewCellSelectionStyleGray; 

    cell.headerLabel.textColor = [UIColor darkGrayColor]; 
    cell.headerLabel.highlightedTextColor = [UIColor whiteColor]; 
    cell.headerLabel.font = [UIFont systemFontOfSize:14]; 

    cell.subLabel.font = [UIFont systemFontOfSize:12]; 
    cell.subLabel.textColor = [UIColor darkGrayColor]; 
    cell.subLabel.numberOfLines = 2; 
    switch (indexPath.section) { 
     case 0: 
     { 
      UIFont *font = [UIFont systemFontOfSize:14.0]; 
      NSDictionary *firstAttributes = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,[UIColor darkGrayColor],NSForegroundColorAttributeName,nil]; 
      UIFont *secondFont = [UIFont systemFontOfSize:10.0]; 
      NSDictionary *secondAttributes = [NSDictionary dictionaryWithObjectsAndKeys:secondFont,NSFontAttributeName,[UIColor lightGrayColor],NSForegroundColorAttributeName,nil]; 
      NSString* completeString = [NSString stringWithFormat:@"%@ | %@",[_libraryPdfArray objectAtIndex:indexPath.row],[_libraryPdfDateArray objectAtIndex:indexPath.row]]; 
      NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]  initWithString:completeString]; 
      [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:[_libraryPdfArray objectAtIndex:indexPath.row]]]; 
      [attributedString setAttributes:secondAttributes range:[completeString rangeOfString:[_libraryPdfDateArray objectAtIndex:indexPath.row]]];    
      cell.headerLabel.attributedText = attributedString; 

      cell.subLabel.text = [_libraryPdfSubtitleArray objectAtIndex:indexPath.row]; 

     } 
      break; 

     case 1: 
     { 
      UIFont *font = [UIFont systemFontOfSize:14.0]; 
      NSDictionary *firstAttributes = [NSDictionary dictionaryWithObjectsAndKeys:font,NSFontAttributeName,[UIColor darkGrayColor],NSForegroundColorAttributeName,nil]; 
      NSString* completeString = [NSString stringWithFormat:@"%@ | %@",[_ebriefingPdfArray objectAtIndex:indexPath.row],[_ebriefingSecondLabelTextArray objectAtIndex:indexPath.row]]; 
      NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]  initWithString:completeString]; 
      [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:[_ebriefingPdfArray objectAtIndex:indexPath.row]]]; 
      [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:[_ebriefingSubtitleArray objectAtIndex:indexPath.row]]]; 
      cell.headerLabel.attributedText = attributedString; 
      cell.subLabel.text = [_ebriefingSubtitleArray objectAtIndex:indexPath.row]; 
     } 
      break; 

     default: 
      break; 
    } 

    return cell; 
} 
+0

からそれをダウンロードしてくださいあなたがそれを否決理由にコメントを追加してください。 –

+0

私が推測していることは、あなたがこれまで行ってきたことを私たちに示すならば、あなたは否定的な票を得ることができないということです。 –

+0

@AnkitSrivastavaこのリンクからの私の答えを参照してくださいhttp://stackoverflow.com/questions/14068962/how-to-use-multiple-font-stylings-on-a-single-string-inside-a-label/14068992#14068992 :) –

答えて

2

を使用してみてください。セルクラスで

は、我々はあなたが、それは非常に便利でしょうRTLabelクラスを使用することができます

- (void) formatText:(BOOL)isSelected{ 
    UIFont *font = [UIFont systemFontOfSize:14.0]; 
    UIFont *secondFont = [UIFont systemFontOfSize:10.0]; 

    NSMutableDictionary *firstAttributes; 
    NSMutableDictionary *secondAttributes; 

    NSDictionary *firstAttributeFont = @{NSFontAttributeName:font}; 
    NSDictionary *secondAttributeFont = @{NSFontAttributeName:secondFont}; 

    [firstAttributes addEntriesFromDictionary:firstAttributeFont]; 
    [secondAttributes addEntriesFromDictionary:secondAttributeFont]; 

    if (!isSelected) { 
     [firstAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor darkGrayColor]}]; 
     [secondAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor lightGrayColor]}]; 

    } 
    else{ 
     [firstAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor whiteColor]}]; 
     [secondAttributes addEntriesFromDictionary:@{NSForegroundColorAttributeName:[UIColor colorWithWhite:1.0 alpha:4.0]}]; 
    } 


    NSString* completeString = [NSString stringWithFormat:@"%@ %@",self.firstAttributeText,self.secondAttributeText]; 
    NSMutableAttributedString *attributedString = [[NSMutableAttributedString alloc]  initWithString:completeString]; 
    [attributedString setAttributes:firstAttributes range:[completeString rangeOfString:self.firstAttributeText]]; 
    [attributedString setAttributes:secondAttributes range:[completeString rangeOfString:self.secondAttributeText]]; 
    self.headerLabel.attributedText = attributedString; 
} 

- (void)setSelected:(BOOL)selected animated:(BOOL)animated{ 

    [super setSelected:selected animated:animated]; 
    [self formatText:selected]; 
    // Configure the view for the selected state 

} 

-(void)setHighlighted:(BOOL)highlighted animated:(BOOL)animated{ 

    [super setHighlighted:highlighted animated:animated]; 
    [self formatText:highlighted]; 

} 
5

私は解決策を持っているこの1

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
     { 

     UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 

     UILabel *label = (UILabel *)[cell viewWithTag:yourTag]; 

     NSMutableAttributedString *str = [[NSMutableAttributedString alloc] initWithString:label.text]; 

[str addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:NSMakeRange(10,10)]; 

     label.attributedText = str 
     } 
+0

これはwillSelectとwillDeselectセルのオプションを使った代替ソリューションですが、セルクラスではなくコントローラでテキストの変更を避けることで、より良い解決策を見つけようとしています。 –

+1

"label.attributedText = str"というだけでなく、 "label.text = str"を実行する必要があります – superpuccio

+0

@superpuccio Thanks changed changed .... –

-1

以下のように文字列を入力起因することができます。ここRTLabel

+0

はい、サードパーティのライブラリでこれを解決できます... – TheCodingArt

2

UILabelサブクラスソリューション

@implementation CustomLabelHighlighted { 
    NSAttributedString *savedAttributedString; 
} 

-(void)setHighlighted:(BOOL)highlighted { 
    if(!SYSTEM_VERSION_LESS_THAN(@"6.0")){ 
     if(highlighted){ 
      if(!self.attributedText){ 
       return; 
      } 

      NSMutableAttributedString *highAttributedString = [self.attributedText mutableCopy]; 
[highAttributedString addAttribute:NSForegroundColorAttributeName value:[UIColor whiteColor] range:(NSRange){0, [highAttributedString.string length]}]; 

      // important! 
      [super setAttributedText:highAttributedString]; 
     } 
     else{ 
      if(savedAttributedString){ 
       self.attributedText = savedAttributedString; 
      } 
     } 
    } else { 
     [super setHighlighted:highlighted]; 
    } 
} 

- (void)setAttributedText:(NSAttributedString *)attributedText { 
    [super setAttributedText:attributedText]; 
    savedAttributedString = attributedText; 
} 

@end 
関連する問題