나는이 UILabel
변화 할 수있는 길이 내 애플 아이폰이나 아이 패드에 세로 또는 가로 모드로 실행 여부에 따라 달라집니다. 텍스트가 너무 길어서 한 줄에 표시 할 수없고 잘릴 때 사용자가 텍스트를 눌러 전체 텍스트 팝업을 볼 수 있기를 바랍니다.
UILabel
이 텍스트가 잘리는 지 어떻게 확인할 수 있습니까? 가능할까요? 지금은 내가 어떤 모드에 있는지에 따라 다른 길이를 확인하고 있지만 잘 작동하지 않습니다.
답변
문자열 의 너비를 계산하고 너비가 다음보다 큰지 확인할 수 있습니다.label.bounds.size.width
NSString UIKit Additions 에는 특정 글꼴로 문자열의 크기를 계산하는 몇 가지 방법이 있습니다. 그러나 시스템에서 해당 크기로 텍스트를 축소 할 수 있도록 레이블에 대한 minimumFontSize가있는 경우. 이 경우 sizeWithFont : minFontSize : actualFontSize : forWidth : lineBreakMode : 를 사용할 수 있습니다 .
CGSize size = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
if (size.width > label.bounds.size.width) {
...
}
답변
Swift (확장자)-여러 줄 uilabel에서 작동합니다.
swift4 : ( attributes
매개 변수가 boundingRect
약간 변경됨)
extension UILabel {
var isTruncated: Bool {
guard let labelText = text else {
return false
}
let labelTextSize = (labelText as NSString).boundingRect(
with: CGSize(width: frame.size.width, height: .greatestFiniteMagnitude),
options: .usesLineFragmentOrigin,
attributes: [.font: font],
context: nil).size
return labelTextSize.height > bounds.size.height
}
}
swift3 :
extension UILabel {
var isTruncated: Bool {
guard let labelText = text else {
return false
}
let labelTextSize = (labelText as NSString).boundingRect(
with: CGSize(width: frame.size.width, height: .greatestFiniteMagnitude),
options: .usesLineFragmentOrigin,
attributes: [NSFontAttributeName: font],
context: nil).size
return labelTextSize.height > bounds.size.height
}
}
swift2 :
extension UILabel {
func isTruncated() -> Bool {
if let string = self.text {
let size: CGSize = (string as NSString).boundingRectWithSize(
CGSize(width: self.frame.size.width, height: CGFloat(FLT_MAX)),
options: NSStringDrawingOptions.UsesLineFragmentOrigin,
attributes: [NSFontAttributeName: self.font],
context: nil).size
if (size.height > self.bounds.size.height) {
return true
}
}
return false
}
}
답변
편집 : 방금 내 대답이 찬성되는 것을 보았지만 내가 준 코드 스 니펫은 더 이상 사용되지 않습니다.
이제이를 수행하는 가장 좋은 방법은 (ARC)입니다.
NSMutableParagraphStyle *paragraph = [[NSMutableParagraphStyle alloc] init];
paragraph.lineBreakMode = mylabel.lineBreakMode;
NSDictionary *attributes = @{NSFontAttributeName : mylabel.font,
NSParagraphStyleAttributeName : paragraph};
CGSize constrainedSize = CGSizeMake(mylabel.bounds.size.width, NSIntegerMax);
CGRect rect = [mylabel.text boundingRectWithSize:constrainedSize
options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes:attributes context:nil];
if (rect.size.height > mylabel.bounds.size.height) {
NSLog(@"TOO MUCH");
}
계산 된 크기는 정수 값이 아닙니다. 따라서와 같은 작업을 수행 int height = rect.size.height
하면 부동 소수점 정밀도가 손실되고 잘못된 결과가 발생할 수 있습니다.
이전 답변 (지원 중단됨) :
레이블이 여러 줄이면 다음 코드를 사용할 수 있습니다.
CGSize perfectSize = [mylabel.text sizeWithFont:mylabel.font constrainedToSize:CGSizeMake(mylabel.bounds.size.width, NSIntegerMax) lineBreakMode:mylabel.lineBreakMode];
if (perfectSize.height > mylabel.bounds.size.height) {
NSLog(@"TOO MUCH");
}
답변
UILabel로 카테고리를 만들 수 있습니다.
- (BOOL)isTextTruncated
{
CGRect testBounds = self.bounds;
testBounds.size.height = NSIntegerMax;
CGRect limitActual = [self textRectForBounds:[self bounds] limitedToNumberOfLines:self.numberOfLines];
CGRect limitTest = [self textRectForBounds:testBounds limitedToNumberOfLines:self.numberOfLines + 1];
return limitTest.size.height>limitActual.size.height;
}
답변
이 카테고리를 사용하여 iOS 7 이상에서 레이블이 잘리는 지 확인하십시오.
// UILabel+Truncation.h
@interface UILabel (Truncation)
@property (nonatomic, readonly) BOOL isTruncated;
@end
// UILabel+Truncation.m
@implementation UILabel (Truncation)
- (BOOL)isTruncated
{
CGSize sizeOfText =
[self.text boundingRectWithSize:CGSizeMake(self.bounds.size.width, CGFLOAT_MAX)
options:(NSStringDrawingUsesLineFragmentOrigin | NSStringDrawingUsesFontLeading)
attributes:@{ NSFontAttributeName : label.font }
context: nil].size;
if (self.frame.size.height < ceilf(sizeOfText.height))
{
return YES;
}
return NO;
}
@end
답변
스위프트 3
문자열을 할당 한 후 줄 수를 계산하고 레이블의 최대 줄 수와 비교할 수 있습니다.
import Foundation
import UIKit
extension UILabel {
func countLabelLines() -> Int {
// Call self.layoutIfNeeded() if your view is uses auto layout
let myText = self.text! as NSString
let attributes = [NSFontAttributeName : self.font]
let labelSize = myText.boundingRect(with: CGSize(width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: attributes, context: nil)
return Int(ceil(CGFloat(labelSize.height) / self.font.lineHeight))
}
func isTruncated() -> Bool {
if (self.countLabelLines() > self.numberOfLines) {
return true
}
return false
}
}
답변
에 추가하려면 iDev 의 대답, 당신은 사용해야하는 intrinsicContentSize
대신 frame
이 자동 레이아웃에 대한 작동하는지,
- (BOOL)isTruncated:(UILabel *)label{
CGSize sizeOfText = [label.text boundingRectWithSize: CGSizeMake(label.intrinsicContentSize.width, CGFLOAT_MAX)
options: (NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
attributes: [NSDictionary dictionaryWithObject:label.font forKey:NSFontAttributeName] context: nil].size;
if (self.intrinsicContentSize.height < ceilf(sizeOfText.height)) {
return YES;
}
return NO;
}