UILabel 텍스트 크기 계산
UILabels
프로그래밍 방식으로 그림을 그리고 있습니다. 데이터베이스에서 크기를 가져옵니다. 그래서 그냥 사용할 수 없습니다 sizeToFit
. 이미 UILabels
통과 된 비율로 다시 그리는 기능을 구현했습니다 . 그래서 내가 찾아야 할 것은 UILabel
다시 그리는 데 최대 비율이 필요한 내보기 의 텍스트입니다 UILabels
. 그래서 마지막으로 다음과 같이해야합니다.
double ratio = 1.00;
for (UILabel* labels in sec.subviews) {
float widthLabel = labels.frame.size.width;
float heightLabel = labels.frame.size.height;
float heightText = //get the text height here
float widthText = //get the text width here
if (widthLabel < widthText) {
ratio = MAX(widthText/widthLabel,ratio);
}
if (heightLabel < heightText) {
ratio = MAX(heightText/heightLabel, ratio);
}
}
//redraw UILabels with the given ratio here
내 텍스트 중 일부가 레이블에 맞지 않아 단순히 레이블 경계를 사용할 수 없기 때문에 텍스트의 높이와 너비 크기를 어떻게 얻을 수 있습니까? Xcode 5와 iOS 7을 사용하고 있습니다.
모든 [NSString sizeWithFont...]
메소드는 iOS 7에서 더 이상 사용되지 않습니다. 대신 이것을 사용하십시오.
CGRect labelRect = [text
boundingRectWithSize:labelSize
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{
NSFontAttributeName : [UIFont systemFontOfSize:14]
}
context:nil];
https://developer.apple.com/documentation/foundation/nsstring/1619914-sizewithfont 도 참조 하십시오 .
UPDATE-boundingRectWithSize 출력의 예
귀하의 의견에 따라 간단한 테스트를 수행했습니다. 코드와 출력은 다음과 같습니다.
// code to generate a bounding rect for text at various font sizes
NSString *text = @"This is a long sentence. Wonder how much space is needed?";
for (NSNumber *n in @[@(12.0f), @(14.0f), @(18.0f)]) {
CGFloat fontSize = [n floatValue];
CGRect r = [text boundingRectWithSize:CGSizeMake(200, 0)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
context:nil];
NSLog(@"fontSize = %f\tbounds = (%f x %f)",
fontSize,
r.size.width,
r.size.height);
}
그러면 다음과 같은 출력이 생성됩니다 (글꼴 크기가 커짐에 따라 경계가 예상대로 변경됩니다).
fontSize = 12.000000 bounds = (181.152008 x 28.632000)
fontSize = 14.000000 bounds = (182.251999 x 50.105999)
fontSize = 18.000000 bounds = (194.039993 x 64.421997)
길이는 문자 수를 가져옵니다. 텍스트의 너비를 얻으려면 :
목표 -C
CGSize textSize = [label.text sizeWithAttributes:@{NSFontAttributeName:[label font]}];
스위프트 4
let size = label.text?.size(withAttributes: [.font: label.font]) ?? .zero
이것은 당신에게 크기를 가져옵니다. 그리고 textSize.width
각 레이블을 비교할 수 있습니다 .
아직 언급하지 않은 또 다른 간단한 방법은 다음과 같습니다.
CGSize textSize = [label intrinsicContentSize];
(물론 레이블의 텍스트와 글꼴을 설정 한 후에 만 올바르게 작동합니다.)
다음은 신속한 변형입니다.
let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"
let textString = text as NSString
let textAttributes = [NSFontAttributeName: font]
textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)
저처럼 당신이 사용하는 작은 충고들 boundingRectWithSize
과 함께[UIFont systemFontOFSize:14]
문자열 길이가 두 줄이면 반환되는 사각형 높이는 33,4 포인트와 같습니다.
int
33,4가 33이되고 33 포인트 높이 레이블이 2 줄에서 1 줄로 넘어 가기 때문에 저처럼 실수하지 마세요 .
문제
CGRect r = [text boundingRectWithSize:CGSizeMake(200, 0)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
context:nil];
인 boundingRectWithSize
CGRect이 가질 수있는 최대 값을 결정한다.
이 문제에 대한 내 해결책은 텍스트가 레이블에 맞을 수 있는지 초과하는지 확인하는 것입니다. 나는 루프를 사용하여 그것을했다.
NSString *text = @"This is a long sentence. Wonder how much space is needed?";
CGFloat width = 100;
CGFloat height = 100;
bool sizeFound = false;
while (!sizeFound) {
NSLog(@"Begin loop");
CGFloat fontSize = 14;
CGFloat previousSize = 0.0;
CGFloat currSize = 0.0;
for (float fSize = fontSize; fSize < fontSize+6; fSize++) {
CGRect r = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fSize]}
context:nil];
currSize =r.size.width*r.size.height;
if (previousSize >= currSize) {
width = width*11/10;
height = height*11/10;
fSize = fontSize+10;
}
else {
previousSize = currSize;
}
NSLog(@"fontSize = %f\tbounds = (%f x %f) = %f",
fSize,
r.size.width,
r.size.height,r.size.width*r.size.height);
}
if (previousSize == currSize) {
sizeFound = true;
}
}
NSLog(@"Size found with width %f and height %f", width, height);
반복 할 때마다 높이와 너비의 크기가 값의 10 % 씩 증가합니다.
내가 6을 선택한 이유는 라벨이 너무 찌그러지는 것을 원하지 않았기 때문입니다.
루프를 사용하지 않는 솔루션의 경우 :
NSString *text = @"This is a long sentence. Wonder how much space is needed?";
CGFloat width = 100;
CGFloat height = 100;
CGFloat currentFontSize = 12;
CGRect r1 = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize+6]}
context:nil];
CGRect r2 = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesFontLeading
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:currentFontSize+6]}
context:nil];
CGFloat firstVal =r1.size.width*r1.size.height;
CGFloat secondVal =r2.size.width*r2.size.height;
NSLog(@"First val %f and second val is %f", firstVal, secondVal);
if (secondVal > firstVal) {
float initRat = secondVal/firstVal;
float ratioToBeMult = sqrtf(initRat);
width *= ratioToBeMult;
height *= ratioToBeMult;
}
NSLog(@"Final width %f and height %f", width, height);
//for verifying
for (NSNumber *n in @[@(12.0f), @(14.0f), @(17.0f)]) {
CGFloat fontSize = [n floatValue];
CGRect r = [text boundingRectWithSize:CGSizeMake(width, height)
options:NSStringDrawingUsesLineFragmentOrigin
attributes:@{NSFontAttributeName:[UIFont systemFontOfSize:fontSize]}
context:nil];
NSLog(@"fontSize = %f\tbounds = (%f x %f) = %f",
fontSize,
r.size.width,
r.size.height,r.size.width*r.size.height);
firstVal =r.size.width*r.size.height;
}
마지막 루프는 더 큰 글꼴이 더 큰 결과를 제공 할 수 있다는 증거입니다.
이 코드 줄을 사용하여 레이블의 텍스트 크기를 얻을 수 있습니다.
let str = "Sample text"
let size = str.sizeWithAttributes([NSFontAttributeName:UIFont.systemFontOfSize(17.0)])
따라서 너비와 높이를 모두 사용할 수 있습니다.
고정 너비에서 높이를 계산하기 위해 여러 줄 레이블 (Swift 4)을 사용하는 솔루션 :
let label = UILabel(frame: .zero)
label.numberOfLines = 0 // multiline
label.font = UIFont.systemFont(ofSize: UIFont.labelFontSize) // your font
label.preferredMaxLayoutWidth = width // max width
label.text = "This is a sample text.\nWith a second line!" // the text to display in the label
let height = label.intrinsicContentSize.height
msgStr 문자열 가져 오기 크기 :
let msgStr:NSString = Data["msg"]! as NSString
let messageSize = msgStr.boundingRect(with: CGSize(width: ChatTable.frame.width-116, height: CGFloat.infinity), options: .usesLineFragmentOrigin, attributes: [NSFontAttributeName:UIFont(name: "Montserrat-Light", size: 14)!], context: nil).size
스위프트 3.0
func getLabelHeight() -> CGFloat {
let font = UIFont(name: "OpenSans", size: 15)!
let textString = "Lorem ipsum dolor sit er elit lamet, consectetaur cillium adipisicing pecu, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." as NSString
let textAttributes = [NSFontAttributeName: font]
let rect = textString.boundingRect(with: CGSize(width: 320, height: 2000), options: .usesLineFragmentOrigin, attributes: textAttributes, context: nil)
return rect.size.height
}
참조 URL : https://stackoverflow.com/questions/19128797/calculating-uilabel-text-size
'IT Share you' 카테고리의 다른 글
ASP.NET MVC URL 경로에 해시 값 포함 (0) | 2021.01.09 |
---|---|
Android Studio에서 최근 프로젝트 목록을 지우는 방법은 무엇입니까? (0) | 2021.01.09 |
CURL (51) SSL 오류 수정 : 일치하는 대체 인증서 주체 이름이 없습니다. (0) | 2021.01.09 |
C # PredicateBuilder 엔터티 : 매개 변수 'f'가 지정된 LINQ to Entities 쿼리 식에 바인딩되지 않았습니다. (0) | 2021.01.09 |
Mongo에서 대소 문자를 구분하지 않는 검색 (0) | 2021.01.09 |