[ios] UILabel이 잘 렸는지 확인하는 방법은 무엇입니까?

나는이 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;
}