Vraag Pixel Breedte van de tekst in een UILabel


Ik moet een UILabel doorhalen. Daarom heb ik UILabel onderverdeeld en geïmplementeerd als volgt:

@implementation UIStrikedLabel

- (void)drawTextInRect:(CGRect)rect{
    [super drawTextInRect:rect];

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextFillRect(context,CGRectMake(0,rect.size.height/2,rect.size.width,1));
}
@end

Wat er gebeurt is dat het UILabel wordt doorgestreept met een regel die net zo lang is als het hele label, maar de tekst kan korter zijn. Is er een manier om de lengte van de tekst in pixels te bepalen, zodat de lijn op de juiste manier kan worden getekend?

Ik sta ook open voor andere oplossingen, indien bekend :)

Het beste, Erik


76
2017-08-27 12:10


oorsprong


antwoorden:


NSString heeft een sizeWithAttributes: methode die hiervoor kan worden gebruikt. Het retourneert een CGSize-structuur, dus u kunt iets soortgelijks als het volgende doen om de breedte van de tekst in uw label te vinden.

iOS 7 en hoger

CGSize textSize = [[label text] sizeWithAttributes:@{NSFontAttributeName:[label font]}];

CGFloat strikeWidth = textSize.width;

iOS <7

Voorafgaand aan iOS7 moest je de gebruiken sizeWithFont: methode.

CGSize textSize = [[label text] sizeWithFont:[label font]];

CGFloat strikeWidth = textSize.width;

UILabel heeft een lettertype-eigenschap die u kunt gebruiken om de lettertypegegevens voor uw label dynamisch te krijgen zoals ik hierboven aan het doen ben.

Ik hoop dat dit helpt :)


194
2017-08-27 12:37



Een betere oplossing, hier in Snel:
Bijwerken:
Voor Swift 3/4:

@IBOutlet weak var testLabel: UILabel!
// in any function
testLabel.text = "New Label Text"
let width = testLabel.intrinsicContentSize.width
let height = testLabel.intrinsicContentSize.height
print("width:\(width), height: \(height)")

Oud antwoord:

yourLabel?.text = "Test label text" // sample label text
let labelTextWidth = yourLabel?.intrinsicContentSize().width
let labelTextHeight = yourLabel?.intrinsicContentSize().height

61
2017-12-29 06:30



hoop dat dit voorbeeld je kan helpen (iOS> 7)

NSString *text = @"    // Do any additional setup after loading the view, typically from a nib.";
CGRect rect = CGRectZero;
NSDictionary *attrDict = @{NSFontAttributeName : [UIFont systemFontOfSize:17]};

rect = [text boundingRectWithSize:CGSizeMake(100,9999)
                          options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
                       attributes:attrDict
                          context:Nil];

UILabel *lbl = [[UILabel alloc] init];
lbl.text = text;
rect.origin = CGPointMake(50, 200);
lbl.frame = rect;
lbl.lineBreakMode = NSLineBreakByWordWrapping;
lbl.numberOfLines = 0;
[self.view addSubview:lbl];

1
2017-11-10 10:42