UILabel 텍스트의 픽셀 너비


78

취소 된 UILabel을 그려야합니다. 따라서 UILabel을 서브 클래 싱하고 다음과 같이 구현했습니다.

@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

UILabel이 전체 ​​레이블만큼 긴 줄로 취소되지만 텍스트가 더 짧을 수 있습니다. 선을 적절하게 그릴 수 있도록 텍스트 길이를 픽셀 단위로 결정하는 방법이 있습니까?

알려진 경우 다른 솔루션에도 열려 있습니다. :)

최고, Erik

답변:


195

NSString에는 이를 위해 사용할 수 있는 sizeWithAttributes : 메소드가 있습니다. CGSize 구조를 반환하므로 다음과 유사한 작업을 수행하여 레이블 내부의 텍스트 너비를 찾을 수 있습니다.

iOS 7 이상

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

CGFloat strikeWidth = textSize.width;

iOS <7

iOS7 이전에는 sizeWithFont : 메소드 를 사용해야했습니다 .

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

CGFloat strikeWidth = textSize.width;

UILabel에는 위에서 수행 한 것처럼 레이블의 글꼴 세부 정보를 동적으로 가져 오는 데 사용할 수있는 글꼴 속성이 있습니다.

도움이 되었기를 바랍니다 :)


5
sizeWithFont는 iOS7부터 더 이상 사용되지 않습니다. CGSize 사용 textSize = [string sizeWithAttributes : @ {NSFontAttributeName : [UIFont systemFontOfSize : 14.0f]}]; 대신.
cldrr

당신은 또한 사용할 수 있습니다 label.attributedText.size.
Jed Fox

70

더 나은 솔루션, 여기 Swift :
Update :
For 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)")

이전 답변 :

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

이 iOS 7과 호환됩니까?
Matej

이 옵션은 훨씬 더 빠릅니다
Josh Bernfeld 2015 년

Newb 질문 .. 레이블을 만들려면 너비 / 높이가 필요하지 않습니까? 적어도 내가있는 곳이다. 레이블을 만드는 텍스트의 너비를 찾으려고합니다. let sanskritLabel = UILabel(frame: CGRectMake(0, 120, sanskritStringSize.width, sanskritStringSize.height))
여행

0

작동합니다. 시도 해봐

NSDictionary *attrDict = @{NSFontAttributeName : [GenericUtility getOpenSansRegularFontSize:12]};
CGSize stringBoundingBox = [selectedReservationModel.DateLabel sizeWithAttributes: attrDict];
lblDeliveryDateWidth = stringBoundingBox.width;
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.