ইউআইএলবেল কেটে ফেলা হয়েছে কিনা তা কীভাবে পরীক্ষা করবেন?


105

আমি একটি আছে UILabelআমার অ্যাপ্লিকেশানটি কোনো iPhone বা iPad এ প্রতিকৃতি বা আড়াআড়ি মোডে চালানো হয় হোক বা না হোক তার উপর নির্ভর করে যে নানারকম যাবে লেন্থ। যখন পাঠ্যটি একটি লাইনে দেখানোর জন্য দীর্ঘ হয় এবং এটি কেটে যায় আমি চাই যে ব্যবহারকারী এটি চাপতে এবং পুরো পাঠ্যের একটি পপআপ পেতে সক্ষম হয়।

UILabelপাঠ্যটি ছাঁটা হচ্ছে কিনা তা আমি কীভাবে পরীক্ষা করতে পারি ? এটা কি সম্ভব? আমি এখন আমি কী মোডে আছি তার ভিত্তিতে বিভিন্ন দৈর্ঘ্যের জন্য যাচাই করছি তবে এটি খুব ভালভাবে কাজ করে না।


1
সমাধান লাইন উপর ভিত্তি করে একটি চেহারা আছে গণনা আমি পোস্ট এখানে
ক্লজ

এত বছর পরেও বিশ্বাস করা যায় না অ্যাপল এখনও UILabelএপিআই- তে এর মতো বেসিক কিছু অন্তর্ভুক্ত করেনি ।
funct7

উত্তর:


108

আপনি স্ট্রিংয়ের প্রস্থ গণনা করতে পারেন এবং প্রস্থের চেয়ে প্রস্থের চেয়ে বেশি কিনা তা দেখতে পারেনlabel.bounds.size.width

এনএসএসআরটিং ইউআইকিট সংযোজনগুলির একটি নির্দিষ্ট ফন্টের সাথে স্ট্রিংয়ের আকার গণনা করার জন্য কয়েকটি পদ্ধতি রয়েছে। তবে আপনার কাছে যদি আপনার লেবেলের জন্য ন্যূনতম ফন্টসাইজ থাকে যা সিস্টেমটিকে সেই আকারের নিচে সঙ্কুচিত করতে দেয়। আপনি আকারটি ব্যবহার করতে চাইতে পারেন উইথফন্ট: মিনিফন্টসাইজ: আসলফন্টসাইজ: ফোরউইথ: লাইনব্রেকমোড: সেক্ষেত্রে

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

1
ধন্যবাদ, এটাই আমার দরকার ছিল। পার্থক্যটি ছিল কেবলমাত্র আকারের সাথে: একটি সিজি সাইজ দেয় ize
র‌্যান্ডাল

আহ, এটি নির্দেশ করার জন্য ধন্যবাদ, আমি নমুনা কোডটি সংশোধন করেছি।
প্রোগ্রামার

16
মাপের উইথফন্টটি অবচিত ব্যবহার করা হয়েছে: [লেবেল.টেক্সট আকার উইথঅ্যাট্রিবিউটস: @ {এনএসফন্টআট্রিবিউটনেম: লেবেল.ফন্ট}];
অ্যামেলিয়া 777

2
@ ফাতুহোকু শ্রেণি রেফারেন্সে numberOfLinesবর্ণিত হিসাবে পাঠ্যটি প্রদর্শন করতে ব্যবহৃত সর্বাধিক সংখ্যক লাইনের প্রত্যাবর্তন করেছে UILabel: বিকাশকারী.অ্যাপল.
পল

1
যদি লেবেলের লাইনের সংখ্যা থাকে তবে এই জাতীয় লাইনের সংখ্যার সাথে প্রস্থের সংখ্যাবৃদ্ধির চেষ্টা করুন (সাইজ.উইথথ> লেবেল.বাউন্ডস.সাইড.উইথ * লেবেল.নম্বারফ্লাইনস) {...}
ফাদি আবুজান্ট

89

সুইফ্ট (এক্সটেনশন হিসাবে) - মাল্টি লাইন ইউইলবেলের জন্য কাজ করে:

swift4: ( attributesএর PARAM 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
    }

}

সিজিফ্লোট (FLT_MAX) দিয়ে 999999.0 এর উচ্চতা প্রতিস্থাপন করুন
এম্বিয়েন্টলাইট

2
সুইফ্ট 3-এর জন্য আমি সিজিফ্লোট
দ্য

2
উত্তরের উত্তর তবে ফানকের পরিবর্তে গণিত সম্পত্তি ব্যবহার করা আরও ভাল: var isTruncated: বুল {যদি স্ট্রিং = সেলফেসটেক্সট size আকার দিন: সিজি সাইজ = (এনএসএসটিং হিসাবে স্ট্রিং) ound বাউন্ডিংআরেক্ট (সহ: সিজি সাইজ (প্রস্থ: সেলফফ্রেম.সাইজ) । প্রস্থ, উচ্চতা: সিজিফ্লোয়াট.রেটেস্টফিন্টম্যাগনিটিউড), বিকল্পগুলি: এনএসএসটিংড্রেইংঅ্যাপশনস.উসেসলাইনফ্র্যাগমেন্টআরগিন, বৈশিষ্ট্য: [এনএসফন্টআট্রিবিউটনেম: স্বতঃফন্ট], প্রসঙ্গ: শূন্য) সাইজ রিটার্ন (সাইজ.ইহাইট> সেল্ফ.বাউন্ডস.সাইজ.হাইট)} রিটার্ন
মোহাম্মদালিজফ

1
এটি আমার পক্ষে কার্যকর হয়নি কারণ আমি একটি এনএসএটিগ্রিবিউটস্ট্রিং ব্যবহার করছিলাম। এটির কাজটি পেতে, আমাকে ব্যবহার করার জন্য বৈশিষ্ট্যগুলির মানটি সংশোধন করতে হবে: বিশিষ্ট পাঠ?? গুণাবলী (এ: 0,
কার্যকররেঞ্জ

1
দুর্দান্ত উত্তর, আমার প্রয়োজনীয়তার জন্য এটি কিছুটা পরিবর্তন করতে হয়েছিল, তবে পুরোপুরি কাজ করেছিল। আমি একটি বৈশিষ্ট্যযুক্ত স্ট্রিংও ব্যবহার করছিলাম - সুতরাং আমি যে বৈশিষ্ট্যগুলি ব্যবহার করেছি তার জন্য: (বিশিষ্ট পাঠ্য? .শক্তি (at: 0, কার্যকরRange: নীল) ?? [.ফন্ট: ফন্ট]), কেবলমাত্র লেবেল পাঠটি ফাঁকা নেই কিনা তা পরীক্ষা করে দেখুন এই সমাধান ব্যবহার করে।
Crt গ্রেগরিিক

20

সম্পাদনা: আমি সবেমাত্র দেখলাম আমার উত্তরটি উক্ত হয়েছে, তবে আমি যে কোড স্নিপেট দিয়েছি তা অবহেলা করা হয়েছে।
এখন এটি করার সর্বোত্তম উপায় হ'ল (এআরসি):

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");
}

নোট করা আকারটি পূর্ণসংখ্যার মান নয় Note সুতরাং আপনি যদি এমন কাজ করেন তবে আপনি 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

আপনি ইউআইএলবেল দিয়ে একটি বিভাগ তৈরি করতে পারেন

- (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:"আপনার এই পদ্ধতিটি সরাসরি কল করা উচিত নয়" ...
মার্টিন

@ মার্টিন আপনাকে ধন্যবাদ, আমি দেখতে পাচ্ছি যে এখানে বাস্তবায়ন সীমাবদ্ধ is তবে আপনি যখন এই পদ্ধতিটি সীমানা এবং পাঠ্য নির্ধারণ করার পরে কল করবেন তখন এটি ভাল কাজ করবে
ডংএক্সউ

সীমাবদ্ধ টন নাম্বার অফলাইন সেট করার সময় আপনি কেন +1 করেন?
অ্যাশ

পাঠ্যটির জন্য আরও জায়গা দেওয়ার সময় লেবেলটি বেশি কিনা তা পরীক্ষা করতে অ্যাশ করুন।
vrwim

1
এই কোডটির জন্য ধন্যবাদ, অটো লেআউট ব্যবহার করার সময় এটি কিছু সীমান্ত ক্ষেত্রে বাদ দিয়ে আমার পক্ষে কাজ করেছিল। আমি এগুলি যোগ করে ঠিক করেছি: setNeedsLayout() layoutIfNeeded()পদ্ধতির শুরুতে।
জোভান জোভানোভস্কি

9

আইওএস 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
    }
}

এটি দ্রুততার জন্য দুর্দান্ত উত্তর। ধন্যবাদ।
জিমিলি

8

আইডিভের উত্তরে যুক্ত করতে, এটির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;
}

ধন্যবাদ! ফ্রেমের পরিবর্তে ইন্টারসনিকটেনটসাইজ ব্যবহার করা আমার সমস্যার সমাধান ছিল যখন ইউআইএলবেলের উচ্চতা আসলে পাঠ্যের সাথে মানানসই পর্যাপ্ত, তবে এতে সীমিত সংখ্যক লাইন রয়েছে এবং সুতরাং এখনও এটি কাটা হচ্ছে।
আন্তন মাতোসোভ

কোনও কারণে, পাঠ্য লেবেলের সাথে খাপ
খায়

6

এই হল. attributedTextসমভূমিতে ফিরে যাওয়ার আগে এটির সাথে কাজ করেtext একইসাথে যা একাধিক ফন্ট পরিবার, আকার এবং এমনকি এনএসটিএক্সটাক অ্যাচটাচমেন্টের সাথে আমাদের व्यवहार করে এমন লোকদের জন্য প্রচুর অর্থবোধ করে!

অটোলেআউট দিয়ে সূক্ষ্মভাবে কাজ করে, তবে স্পষ্টতই সীমাবদ্ধতাগুলি অবশ্যই আমাদের চেক করার আগে সংজ্ঞায়িত করতে হবে এবং সেট করতে হবে isTruncated, অন্যথায় লেবেল নিজেই জানবে না কীভাবে নিজেকে কীভাবে ছড়িয়ে দেওয়া যায়, তাই এটি কেটে যাবে কিনা তা এমনকি কোনওভাবেই এটি জানতেও পারে না।

এটি কেবল একটি সরল NSStringএবং দিয়ে এই সমস্যাটির সাথে যোগাযোগ করতে কাজ করে না sizeThatFits। আমি নিশ্চিত না যে কীভাবে লোকেরা ইতিবাচক ফলাফল পাচ্ছে। বিটিডাব্লু, যেমন অসংখ্যবার উল্লেখ করা হয়েছে, ব্যবহার sizeThatFitsমোটেই আদর্শ নয় কারণ এটি numberOfLinesফলাফলের আকারের জন্য বিবেচনায় নেয় , যা আমরা যা করার চেষ্টা করছি তার পুরো উদ্দেশ্যকে পরাস্ত করে, কারণ এটি কেটে বা না ছাড়াই isTruncatedসর্বদা ফিরে আসবে wouldfalse

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

দুর্দান্ত উত্তর। কেবলমাত্র ইস্যুটিইটেক্সটেক্সটটি এটাক্ট না করা সত্ত্বেও টেক্সট কখনই শূন্য হয় না don't সুতরাং, আমি এটি দুটি ভার্সটি টেক্সটট্রাক্টেড এবং ইসএট্রিবিউটেডটেক্সট ট্রান্সেক্টেড হিসাবে প্রয়োগ করেছি।
হ্যারিস

@ হারিস এটি বলেছে যে ডিফল্টটি ইউইলবেল.এইচ.এল ফাইলের মধ্যে নেই
লুকাস

@ লুকাসচুয়ে আমি জানি, তবে বাস্তবে এটি সত্য নয়। আপনি এটি নিজের জন্য চেষ্টা করে দেখতে পারেন। এফআইআই
হ্যারিস

3

এখানে সুইফ্ট 3-এ নির্বাচিত উত্তরটি দেওয়া হয়েছে (এক্সটেনশন হিসাবে)। ওপি প্রায় 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
    }
}

অ্যাক্সেলের উত্তর এটির জন্য কার্যকর হয়নি। এই এক করেছে। ধন্যবাদ!
গ্লেন

2

এটি আইওএস 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

আমি ইউআইএলবেলের কাটা কাটা নিয়ে কাজ করার জন্য একটি বিভাগ লিখেছি। 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

প্রতিবার এটি কেবল এনএসনটফাউন্ড দেয়
দারি

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

@ আইদেভ যা করেছে তাতে যুক্ত করতে আমি 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 হতে পারে) তবে আপনি বলছেন যে লেবেলটি কেটে গেছে। এই কাজ করার কোন উপায় নেই।
লেলোওলু 17'14

@ CanLeloğlu এটি পরীক্ষা করুন। এটি একটি কাজের উদাহরণ।
রাজ

2
অফলাইন সংখ্যাটি যদি শূন্যের সমান হয়?
Lelo atlu

0

আইওএস 6 হ্যান্ডেল করতে (হ্যাঁ, আমাদের মধ্যে কিছু এখনও আছে), @ আইডিএভ এর উত্তরটির আরও একটি বিস্তৃতি এখানে। মূল গ্রহণযোগ্যতাটি হ'ল, আইওএস 6 এর জন্য, আপনার ইউআইএলবেলের নম্বর অফলাইনগুলি সাইজথ্যাটফিটগুলি কল করার আগে 0 তে সেট করা আছে তা নিশ্চিত করা; যদি তা না হয় তবে এটি আপনাকে একটি ফলাফল দেবে যা বলবে যে লেবেলের পাঠ্য আঁকার জন্য "পয়েন্টগুলির উচ্চতার উচ্চতা অনুসারে সংখ্যাগুলি আঁকার জন্য পয়েন্টগুলি" দরকার।

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

ডিভিডলআউটসুবউভিউগুলিতে এগুলির মধ্যে যে কোনও একটিকে কল করতে ভুলবেন না।

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

সুইফট 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

সুইফট 3 সমাধান

আমি মনে করি যে (1)UILabel আপনি কাটানোর জন্য যে লেবেলটি পরীক্ষা করছেন তার একই বৈশিষ্ট্য সহ একটি (1) তৈরি করা , (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

লেবেলের জন্য শিরোনামের বৈশিষ্ট্যটি নির্ধারণ করা সহজ হবে না, এটি সেট করলে পুরো আটকানো অবস্থায় পুরো লেবেল প্রদর্শিত হবে।

আপনি লেবেলের দৈর্ঘ্য এবং ডিভ প্রস্থ গণনা করতে পারেন (দৈর্ঘ্যে রূপান্তর করুন - jQuery / জাভাস্ক্রিপ্ট - আমি কীভাবে পিক্সেল মান (20px) একটি সংখ্যার মান (20%) তে রূপান্তর করব ?

দৈর্ঘ্য ডিভ প্রস্থের চেয়ে বেশি হলে শিরোনাম সেট করতে jquery সেট করুন।

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.