จะตรวจสอบได้อย่างไรว่า UILabel ถูกตัดทอนหรือไม่?


107

ฉันมี UILabelความยาวที่แตกต่างกันไปขึ้นอยู่กับว่าแอปของฉันทำงานในโหมดแนวตั้งหรือแนวนอนบน iPhone หรือ iPad หรือไม่ เมื่อข้อความยาวเกินไปที่จะแสดงในบรรทัดเดียวและถูกตัดทอนฉันต้องการให้ผู้ใช้สามารถกดและรับป๊อปอัปของข้อความเต็มได้

ฉันจะตรวจสอบได้อย่างไรว่าข้อความUILabelนั้นถูกตัดทอนหรือไม่ เป็นไปได้หรือไม่? ตอนนี้ฉันกำลังตรวจสอบความยาวที่แตกต่างกันตามโหมดที่ฉันอยู่ แต่มันทำงานได้ไม่ดีนัก


1
ดูวิธีแก้ปัญหาตามจำนวนบรรทัดที่ฉันโพสต์ไว้ที่นี่
Claus

ไม่อยากจะเชื่อเลยว่าหลังจากหลายปีที่ผ่านมา Apple ยังไม่ได้รวมบางสิ่งที่เป็นพื้นฐานไว้ในUILabelAPI
funct7

คำตอบ:


110

คุณสามารถคำนวณความกว้างของสตริงและดูว่าความกว้างมากกว่าหรือไม่label.bounds.size.width

NSString UIKit Additionsมีหลายวิธีในการคำนวณขนาดของสตริงด้วยฟอนต์เฉพาะ อย่างไรก็ตามหากคุณมีขนาดขั้นต่ำสำหรับป้ายกำกับของคุณที่อนุญาตให้ระบบย่อขนาดข้อความลงไปที่ขนาดนั้น คุณอาจต้องการใช้sizeWithFont: minFontSize: actualFontSize: forWidth: lineBreakMode:ในกรณีนั้น

CGSize size = [label.text sizeWithAttributes:@{NSFontAttributeName:label.font}];
if (size.width > label.bounds.size.width) {
   ...
}

1
ขอบคุณนี่คือสิ่งที่ฉันต้องการ ข้อแตกต่างเพียงอย่างเดียวคือ sizeWithFont: ส่งคืน CGSize
Randall

อาขอบคุณที่ชี้ให้เห็นว่าฉันได้แก้ไขโค้ดตัวอย่างแล้ว
progrmr

16
sizeWithFont เลิกใช้แล้ว: [label.text sizeWithAttributes: @ {NSFontAttributeName: label.font}];
Amelia777

2
@fatuhoku numberOfLinesส่งคืนจำนวนบรรทัดสูงสุดที่ใช้เพื่อแสดงข้อความตามที่ระบุไว้ในการUILabelอ้างอิงคลาส: developer.apple.com/library/ios/documentation/UIKit/Reference/…
Paul

1
หากป้ายกำกับมีจำนวนบรรทัดให้ลองคูณความกว้างด้วยจำนวนบรรทัดเช่นนี้ if (size.width> label.bounds.size.width * label.numberOfLines) {... }
Fadi Abuzant

91

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
    }

}

แทนที่ความสูง 999999.0 ด้วย CGFloat (FLT_MAX)
แสงโดยรอบ

2
สำหรับ swift 3 ฉันจะใช้ CGFloat.greatestFiniteMagnitude
zero3nna

2
คำตอบที่ดี แต่ควรใช้คุณสมบัติจากการคำนวณแทน func: var isTruncated: Bool {if let string = self.text {let size: CGSize = (string as NSString) .boundingRect (with: CGSize (width: self.frame.size) .width, height: CGFloat.greatestFiniteMagnitude) ตัวเลือก: NSStringDrawingOptions.usesLineFragmentOrigin แอตทริบิวต์: [NSFontAttributeName: self.font] บริบท: nil) ผลตอบแทนขนาด (size.height> self.bounds.size.height)} ส่งคืนเท็จ}
Mohammadalijf

1
สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะฉันใช้ NSAttributedString เพื่อให้ใช้งานได้ฉันต้องแก้ไขค่าแอตทริบิวต์เพื่อใช้: attributedText? .attributes (ที่: 0, EffectiveRange: nil)
pulse4life

1
คำตอบที่ดีต้องเปลี่ยนแปลงเล็กน้อยตามความต้องการของฉัน แต่ทำงานได้อย่างสมบูรณ์ ฉันยังใช้สตริงแอตทริบิวต์ - ดังนั้นสำหรับแอตทริบิวต์ที่ฉันใช้: (attributedText? .attributes (at: 0, EffectiveRange: nil) ?? [.font: font]) เพียงตรวจสอบว่า labelText ไม่ว่างเปล่าเมื่อ โดยใช้วิธีนี้
Crt Gregoric

20

แก้ไข:ฉันเพิ่งเห็นว่าคำตอบของฉันได้รับการโหวตแล้ว แต่ข้อมูลโค้ดที่ฉันให้นั้นเลิกใช้แล้ว
วิธีที่ดีที่สุดในการดำเนินการคือ (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");
}

13

คุณสามารถสร้างหมวดหมู่ด้วย 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;
}

3
จากเอกสาร: textRectForBounds:limitedToNumberOfLines:"คุณไม่ควรเรียกวิธีนี้โดยตรง" ...
Martin

@Martin ขอบคุณฉันเห็นว่าการใช้งานที่นี่มี จำกัด แต่เมื่อคุณเรียกวิธีนี้หลังจากตั้งค่าขอบเขตและข้อความมันจะทำงานได้ดี
DongXu

ทำไมคุณถึง +1 เมื่อตั้งค่า limitedToNumberOfLines
เถ้า

@Ash เพื่อตรวจสอบว่าป้ายกำกับสูงขึ้นหรือไม่เมื่อได้รับอนุญาตให้มีพื้นที่สำหรับข้อความมากขึ้น
vrwim

1
ขอบคุณสำหรับรหัสนี้มันใช้งานได้สำหรับฉันนอกเหนือจากบางกรณีที่ใช้การจัดวางอัตโนมัติ ฉันแก้ไขโดยการเพิ่ม: setNeedsLayout() layoutIfNeeded()ที่จุดเริ่มต้นของวิธีการ
Jovan Jovanovski

9

ใช้หมวดหมู่นี้เพื่อค้นหาว่าป้ายกำกับถูกตัดบน 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

9

สวิฟต์ 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
    }
}

นี่คือคำตอบที่ดีสำหรับความรวดเร็ว ขอบคุณ.
JimmyLee

8

หากต้องการเพิ่มคำตอบของiDevคุณควรใช้intrinsicContentSizeแทนframeเพื่อให้ใช้งานได้กับ Autolayout

- (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;
}

ขอบคุณ! การใช้ intrinsicContentSize แทน frame เป็นวิธีแก้ปัญหาของฉันเมื่อความสูงของ UILabel นั้นเพียงพอที่จะใส่ข้อความได้จริง แต่มีจำนวนบรรทัดที่ จำกัด จึงยังคงตัดทอน
Anton Matosov

ด้วยเหตุผลบางประการสิ่งนี้จะส่งคืน NO แม้ว่าข้อความจะไม่พอดีกับป้ายกำกับ
ก็ตาม

6

นี่ไง. สิ่งนี้ใช้ได้ผลattributedTextก่อนที่จะถอยกลับไปสู่ความเรียบง่ายtextซึ่งเหมาะสมมากสำหรับพวกเราที่ต้องจัดการกับตระกูลฟอนต์หลายขนาดและแม้แต่ NSTextAttachments!

ทำงานได้ดีกับ autolayout แต่แน่นอนว่าต้องกำหนดและตั้งค่าข้อ จำกัด ก่อนที่เราจะตรวจสอบisTruncatedมิฉะนั้นป้ายกำกับจะไม่รู้ด้วยซ้ำว่าจะจัดวางอย่างไรดังนั้นจึงไม่มีทางรู้ได้ว่ามีการตัดทอนหรือไม่

มันใช้ไม่ได้ในการแก้ไขปัญหานี้เพียงแค่ธรรมดาNSStringและsizeThatFits. ฉันไม่แน่ใจว่าผู้คนได้รับผลบวกเช่นนั้นอย่างไร BTW ตามที่กล่าวไว้หลายครั้งการใช้sizeThatFitsไม่เหมาะเลยเนื่องจากคำนึงnumberOfLinesถึงขนาดผลลัพธ์ซึ่งเอาชนะจุดประสงค์ทั้งหมดของสิ่งที่เราพยายามทำเพราะisTruncatedจะกลับมาเสมอfalseไม่ว่าจะถูกตัดทอนหรือไม่ก็ตาม

extension UILabel {
    var isTruncated: Bool {
        layoutIfNeeded()

        let rectBounds = CGSize(width: bounds.width, height: .greatestFiniteMagnitude)
        var fullTextHeight: CGFloat?

        if attributedText != nil {
            fullTextHeight = attributedText?.boundingRect(with: rectBounds, options: .usesLineFragmentOrigin, context: nil).size.height
        } else {
            fullTextHeight = text?.boundingRect(with: rectBounds, options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font], context: nil).size.height
        }

        return (fullTextHeight ?? 0) > bounds.size.height
    }
}

ใช้งานได้ดีสำหรับฉันขอบคุณ !! มีการอัปเดตหรือแก้ไขใด ๆ สำหรับสิ่งนี้หรือไม่?
amodkanthe

คำตอบที่ดี ปัญหาเดียวคือแอตทริบิวต์ข้อความไม่เป็นศูนย์แม้ว่าคุณจะไม่ได้ตั้งค่าก็ตาม ดังนั้นฉันจึงใช้สิ่งนี้เป็นสองตัวแปรคือ isTextTruncated และ isAttributedTextTruncated
Harris

@ แฮร์ริสบอกว่าค่าเริ่มต้นเป็นศูนย์ในไฟล์ uilabel.h
Lucas

@LucasChwe ฉันรู้ แต่มันไม่เป็นความจริงในทางปฏิบัติ คุณสามารถลองด้วยตัวคุณเองและดู fyi, forums.developer.apple.com/thread/118581
Harris

4

นี่คือคำตอบที่เลือกใน Swift 3 (เป็นส่วนขยาย) OP ถามเกี่ยวกับป้ายกำกับ 1 บรรทัด คำตอบที่รวดเร็วจำนวนมากที่ฉันลองที่นี่เป็นคำตอบเฉพาะสำหรับป้ายกำกับหลายบรรทัดและไม่ได้ตั้งค่าสถานะอย่างถูกต้องบนป้ายกำกับบรรทัดเดียว

extension UILabel {
    var isTruncated: Bool {
        guard let labelText = text as? NSString else {
            return false
        }
        let size = labelText.size(attributes: [NSFontAttributeName: font])
        return size.width > self.bounds.width
    }
}

คำตอบของ Axel ไม่ได้ผลสำหรับสิ่งนี้ อันนี้ทำ ขอบคุณ!
Glenn

2

สิ่งนี้ใช้ได้กับ iOS 8:

CGSize size = [label.text boundingRectWithSize:CGSizeMake(label.bounds.size.width, NSIntegerMax) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : label.font} context:nil].size;

if (size.height > label.frame.size.height) {
    NSLog(@"truncated");
}

2

ฉันได้เขียนหมวดหมู่สำหรับการทำงานกับการตัดทอนของ UILabel ทำงานบน iOS 7 และใหม่กว่า หวังว่าจะช่วยได้! การตัดหาง uilabel

@implementation UILabel (Truncation)

- (NSRange)truncatedRange
{
    NSTextStorage *textStorage = [[NSTextStorage alloc] initWithAttributedString:[self attributedText]];

    NSLayoutManager *layoutManager = [[NSLayoutManager alloc] init];
    [textStorage addLayoutManager:layoutManager];

    NSTextContainer *textContainer = [[NSTextContainer alloc] initWithSize:[self bounds].size];
    textContainer.lineFragmentPadding = 0;
    [layoutManager addTextContainer:textContainer];

    NSRange truncatedrange = [layoutManager truncatedGlyphRangeInLineFragmentForGlyphAtIndex:0];
    return truncatedrange;
}

- (BOOL)isTruncated
{
    return [self truncatedRange].location != NSNotFound;
}

- (NSString *)truncatedText
{
    NSRange truncatedrange = [self truncatedRange];
    if (truncatedrange.location != NSNotFound)
    {
        return [self.text substringWithRange:truncatedrange];
    }

    return nil;
}

@end

ทุกครั้งที่ให้ NSNotFound เท่านั้น
Dari

2
extension UILabel {

public func resizeIfNeeded() -> CGFloat? {
    guard let text = text, !text.isEmpty else { return nil }

    if isTruncated() {
        numberOfLines = 0
        sizeToFit()
        return frame.height
    }
    return nil
}

func isTruncated() -> Bool {
    guard let text = text, !text.isEmpty else { return false }

    let size: CGSize = text.size(withAttributes: [NSAttributedStringKey.font: font])
    return size.width > self.bounds.size.width
    }
}

คุณสามารถคำนวณความกว้างของสตริงและดูว่าความกว้างมากกว่าความกว้างของฉลากหรือไม่


1

ในการเพิ่มสิ่งที่@iDevไม่ฉันปรับเปลี่ยนself.frame.size.heightการใช้งานและยังไม่ได้ใช้label.frame.size.height NSStringDrawingUsesLineFontLeadingหลังจากการปรับเปลี่ยนเหล่านั้นฉันคำนวณได้อย่างสมบูรณ์แบบว่าการตัดทอนจะเกิดขึ้นเมื่อใด (อย่างน้อยก็สำหรับกรณีของฉัน)

- (BOOL)isTruncated:(UILabel *)label {
    CGSize sizeOfText = [label.text boundingRectWithSize: CGSizeMake(label.bounds.size.width, CGFLOAT_MAX)
                                                 options: (NSStringDrawingUsesLineFragmentOrigin)
                                              attributes: [NSDictionary dictionaryWithObject:label.font forKey:NSFontAttributeName] context: nil].size;

    if (label.frame.size.height < ceilf(sizeOfText.height)) {
        return YES;
    }
    return NO;
}

1

ฉันมีปัญหาboundingRect(with:options:attributes:context:)เมื่อใช้การจัดวางอัตโนมัติ (เพื่อตั้งค่าความสูงสูงสุด) และข้อความที่มาจากไฟล์NSParagraph.lineSpacing

ระยะห่างระหว่างบรรทัดถูกละเว้น (แม้ว่าจะส่งผ่านattributesไปยังboundingRectเมธอด) ดังนั้นป้ายกำกับอาจถูกพิจารณาว่าไม่ถูกตัดทอนเมื่อมันถูก

วิธีแก้ปัญหาที่ฉันพบคือใช้UIView.sizeThatFits:

extension UILabel {
    var isTruncated: Bool {
        layoutIfNeeded()
        let heightThatFits = sizeThatFits(bounds.size).height
        return heightThatFits > bounds.size.height
    }
}

0

เนื่องจากคำตอบทั้งหมดข้างต้นใช้วิธีการหักค่าเสื่อมราคาฉันคิดว่านี่อาจเป็นประโยชน์

- (BOOL)isLabelTruncated:(UILabel *)label
{
    BOOL isTruncated = NO;

    CGRect labelSize = [label.text boundingRectWithSize:CGSizeFromString(label.text) options:NSStringDrawingUsesLineFragmentOrigin attributes:@{NSFontAttributeName : label.font} context:nil];

    if (labelSize.size.width / labelSize.size.height > label.numberOfLines) {

        isTruncated = YES;
    }

    return isTruncated;
}

คุณกำลังหารความกว้างด้วยความสูงและถ้ามันใหญ่กว่าจำนวนบรรทัด (ซึ่งอาจเป็น 0 ได้) แสดงว่าป้ายกำกับถูกตัดทอน ไม่มีวิธีนี้ได้ผล
Can Leloğlu

@ CanLeloğluโปรดทดสอบ เป็นตัวอย่างการทำงาน
Raz

2
จะเกิดอะไรขึ้นถ้า numberOfLines เท่ากับศูนย์?
Can Leloğlu

0

ในการจัดการกับ iOS 6 (ใช่พวกเราบางคนยังคงต้องทำ) นี่คือการขยายอีกครั้งสำหรับคำตอบของ @ iDev ประเด็นสำคัญคือสำหรับ iOS 6 เพื่อให้แน่ใจว่า UILabel's numberOfLines ของคุณถูกตั้งค่าเป็น 0 ก่อนที่จะเรียก sizeThatFits; หากไม่เป็นเช่นนั้นจะให้ผลลัพธ์ที่ระบุว่า "ต้องใช้คะแนนที่จะวาด numberOfLines มูลค่าความสูง" ในการวาดข้อความป้ายกำกับ

- (BOOL)isTruncated
{
    CGSize sizeOfText;

    // iOS 7 & 8
    if([self.text respondsToSelector:@selector(boundingRectWithSize:options:attributes:context:)])
    {
        sizeOfText = [self.text boundingRectWithSize:CGSizeMake(self.bounds.size.width,CGFLOAT_MAX)
                                             options:(NSStringDrawingUsesLineFragmentOrigin|NSStringDrawingUsesFontLeading)
                                          attributes:@{NSFontAttributeName:self.font}
                                             context:nil].size;
    }
    // iOS 6
    else
    {
        // For iOS6, set numberOfLines to 0 (i.e. draw label text using as many lines as it takes)
        //  so that siteThatFits works correctly. If we leave it = 1 (for example), it'll come
        //  back telling us that we only need 1 line!
        NSInteger origNumLines = self.numberOfLines;
        self.numberOfLines = 0;
        sizeOfText = [self sizeThatFits:CGSizeMake(self.bounds.size.width,CGFLOAT_MAX)];
        self.numberOfLines = origNumLines;
    }

    return ((self.bounds.size.height < sizeOfText.height) ? YES : NO);
}

0

อย่าลืมเรียกสิ่งเหล่านี้ใน viewDidLayoutSubviews

public extension UILabel {

    var isTextTruncated: Bool {
        layoutIfNeeded()
        return text?.boundingRect(with: CGSize(width: bounds.width, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, attributes: [NSAttributedString.Key.font: font!], context: nil).size.height ?? 0 > bounds.size.height
    }

    var isAttributedTextTruncated: Bool {
        layoutIfNeeded()
        return attributedText?.boundingRect(with: CGSize(width: bounds.width, height: .greatestFiniteMagnitude), options: .usesLineFragmentOrigin, context: nil).size.height ?? 0 > bounds.size.height
    }

}

0

SWIFT 5

ตัวอย่างสำหรับ UILabel แบบเรียงหลายเส้นที่กำหนดให้แสดงเพียง 3 บรรทัด

    let labelSize: CGSize = myLabel.text!.size(withAttributes: [.font: UIFont.systemFont(ofSize: 14, weight: .regular)])

    if labelSize.width > myLabel.intrinsicContentSize.width * 3 {
        // your label will truncate
    }

แม้ว่าผู้ใช้อาจเลือกปุ่มส่งคืนโดยเพิ่มบรรทัดพิเศษโดยไม่ต้องเพิ่ม "ความกว้างของข้อความ" ในกรณีเช่นนี้ก็อาจมีประโยชน์เช่นกัน

func textView(_ textView: UITextView, shouldChangeTextIn range: NSRange, replacementText text: String) -> Bool {

    if text == "\n" {
        // return pressed 

    }
}

-1

โซลูชัน Swift 3

ฉันคิดว่าทางออกที่ดีที่สุดคือ(1)สร้างที่UILabelมีคุณสมบัติเดียวกับป้ายกำกับที่คุณกำลังตรวจสอบการตัดทอน, (2)โทร.sizeToFit(), (3)เปรียบเทียบลักษณะของฉลากหุ่นที่มีป้ายที่แท้จริงของคุณ

ตัวอย่างเช่นหากคุณต้องการตรวจสอบว่าป้ายชื่อที่มีความกว้างต่างกันจะตัดทอนหรือไม่คุณสามารถใช้ส่วนขยายนี้:

extension UILabel {
    func isTruncated() -> Bool {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: CGFloat.greatestFiniteMagnitude, height: self.bounds.height))
        label.numberOfLines = 1
        label.font = self.font
        label.text = self.text
        label.sizeToFit()
        if label.frame.width > self.frame.width {
            return true
        } else {
            return false
        }
    }
}

... แต่อีกครั้งคุณสามารถแก้ไขโค้ดด้านบนให้เหมาะกับความต้องการของคุณได้อย่างง่ายดาย สมมติว่าฉลากของคุณมีหลายเส้นและมีความสูงต่างกัน จากนั้นส่วนขยายจะมีลักษณะดังนี้:

extension UILabel {
    func isTruncated() -> Bool {
        let label = UILabel(frame: CGRect(x: 0, y: 0, width: self.bounds.width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.font = self.font
        label.text = self.text
        label.sizeToFit()
        if label.frame.height > self.frame.height {
            return true
        } else {
            return false
        }
    }
}

-6

การตั้งค่าแอตทริบิวต์ title สำหรับป้ายกำกับจะไม่ง่ายหรือไม่การตั้งค่านี้จะแสดงป้ายกำกับแบบเต็มเมื่อวางเมาส์

คุณสามารถคำนวณความยาวของป้ายกำกับและความกว้าง div (แปลงเป็นความยาว - jQuery / Javascript - ฉันจะแปลงค่าพิกเซล (20px) เป็นค่าตัวเลขได้อย่างไร (20) )

ตั้งค่า jquery เพื่อตั้งหัวเรื่องหากความยาวมากกว่าความกว้าง div

var divlen = parseInt(jQuery("#yourdivid").width,10);
var lablen =jQuery("#yourlabelid").text().length;
if(lablen < divlen){
jQuery("#yourlabelid").attr("title",jQuery("#yourlabelid").text());
}
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.