ggfela
ggfela

Reputation: 1152

UIRefreshControl attributedTitle multiple lines

Is it possible to use multiple lines in the UIRefreshControl title? Whenever I add \n to the NSAttributedString only the first line will be displayed. I'm trying to set a title and on the next line some more text. So is there a workaround to use two lines of text in the UIRefreshControl?

This is the current code where only "Title Here" is displayed:

self.refreshControl = [[UIRefreshControl alloc] init];

NSString *title = @"Title Here";
NSString *subText = @"Subtext Here";
NSMutableAttributedString *attString=[[NSMutableAttributedString alloc] initWithString:[NSString stringWithFormat:@"%@\n%@",title,subText]];

[attString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica" size:20.0f] range:NSMakeRange(0, [title length])];
[attString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica" size:14.0f] range:NSMakeRange([title length],[subText length])];

[attString addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, [title length])];
[attString addAttribute:NSForegroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange([title length], [subText length])];

self.refreshControl.attributedTitle = attString;

Upvotes: 4

Views: 2916

Answers (3)

Bishal Ghimire
Bishal Ghimire

Reputation: 2610

The trick is to change the UILable's property of Refresh Controller to Zero. The hack is we have to find the label through the subviews and there child as shown below.

Here is a Swift version

    if let refreshLabel = refreshControl?.subviews.first?.subviews.last as? UILabel {
            refreshLabel.numberOfLines = 0
    }

So here is the full code sample

private var marketRefreshController = UIRefreshControl()
private var lastUpdatedDate = Date()

override func viewDidLoad() {
    super.viewDidLoad()
    tableView.refreshControl = marketRefreshController
    if let refreshLabel = refreshControl?.subviews.first?.subviews.last as? UILabel {
        refreshLabel.numberOfLines = 0
    }
    marketRefreshController.addTarget(self, action: #selector(refreshMarketData), for: .valueChanged)
    marketRefreshController.tintColor = UIColor.blue
    let textAttributes = [NSAttributedString.Key.font: UIFont.appSubTitle,
                          NSAttributedString.Key.foregroundColor: UIColor.blue]
    let timeSinceLastUpdate = lastUpdatedDate.timeAgoSinceNow // Date Sting Converter Helper Method
    let displayString = "Fetching Market Data ... \n Last Updated: \(timeSinceLastUpdate)"
    marketRefreshController.attributedTitle = NSAttributedString(string: displayString,
                                                                 attributes: textAttributes)
    tableView.addSubview(marketRefreshController)
}

The expected output should be like - Refresh Control with multipline text on tableview controller

Upvotes: 0

c0ming
c0ming

Reputation: 3543

here is a tricky method: find the UILabel in the UIRefreshControl and set numberOfLines = 0.

UILabel *titleLabel = [[[[self.refreshControl subviews] firstObject] subviews] lastObject];
if (titleLabel) {
    titleLabel.numberOfLines = 0;

    NSString title = @"Pull to Refresh.\nUpdated Time: 09:30"; // \n for new line.
    self.refreshControl.attributedTitle = [[NSAttributedString alloc] initWithString:title];
}

Upvotes: 4

RJR
RJR

Reputation: 1072

This piece of code will work

NSString *title = @"Title Here";
NSString *subText = @"Subtext Here";

NSMutableAttributedString *titleAttString =  [[NSMutableAttributedString alloc] initWithString:title];
NSMutableAttributedString *subTitleAttString =  [[NSMutableAttributedString alloc] initWithString:subText];

[titleAttString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica" size:20.0f] range:NSMakeRange(0, [title length])];
[subTitleAttString addAttribute:NSFontAttributeName value:[UIFont fontWithName:@"Helvetica" size:14.0f] range:NSMakeRange(0,[subTitle length])];

[titleAttString addAttribute:NSForegroundColorAttributeName value:[UIColor blackColor] range:NSMakeRange(0, [title length])];
[subTitleAttString addAttribute:NSForegroundColorAttributeName value:[UIColor lightGrayColor] range:NSMakeRange(0, [subTitle length])];

[titleAttString appendAttributedString:subTitleAttString];

self.refreshControl.attributedTitle = titleAttString;

Upvotes: 1

Related Questions