Ankit Srivastava
Ankit Srivastava

Reputation: 12405

Set highlighted text color for UILabel using NSAttributedString.?

I am using a label on tableview cell. The cell has been assigned an attributed string, but the problem is that on selection the cell text does not turn white for attributed string.

Is there any way to fix it..?

Any help is appreciated.

Here is a look at my code.

- (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;
}

Upvotes: 6

Views: 15226

Answers (4)

Dharmbir Singh
Dharmbir Singh

Reputation: 17535

Try to use this one

    -(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
        }

Upvotes: 5

Uladzimir
Uladzimir

Reputation: 3486

UILabel subclass solution

@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

Upvotes: 2

Prateek Prem
Prateek Prem

Reputation: 1544

You can use RTLabel class it will very usefull. Download it from here RTLabel

Upvotes: -1

Ankit Srivastava
Ankit Srivastava

Reputation: 12405

I have got the solution.

In Cell class, we can input attributed strings as below

- (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];

}

Upvotes: 2

Related Questions