2012-10-18 10 views
5

बदल जाएगी मेरे पास एक बहु-रेखा UILabel (numberOfLines = 0) है। यह चौड़ाई रनटाइम पर बदल सकती है, और कभी-कभी यह छंटनी और/या फिर से लपेटने की ओर ले जाती है।कैसे बताएं कि जब UILabel को छोटा कर दिया जाएगा/या इसकी लाइन ब्रेक स्थिति

उदाहरण 1:: कुछ उदाहरणों में सबसे अच्छा उदाहरण देकर स्पष्ट करना चौड़ाई में कमी एक अलग लाइन ब्रेक बिंदु की ओर जाता है

enter image description here enter image description here

उदाहरण 2: चौड़ाई में कमी काट-छांट

की ओर जाता है

enter image description here enter image description here

उदाहरण 3: चौड़ाई में कमी दोनों काट-छांट और एक अलग लाइन ब्रेक स्थिति की ओर जाता है

enter image description here enter image description here

उदाहरण 4: चौड़ाई में कमी काट-छांट या लाइन पर कोई असर नहीं होता है तोड़ स्थिति

enter image description here enter image description here

चूंकि स्वरूपण में यह परिवर्तन काफी झटकेदार हो सकता है, इसलिए मैं इसे कुछ एनीमेशन (शायद एक फीका/फीका आउट) के पीछे मुखौटा करना चाहता हूं। हालांकि, पहली बाधा की पहचान कर रही है जब मुझे यह करने की ज़रूरत है। जब भी लेबल फिर से आकार में होता है तो मैं एनीमेशन को लागू नहीं करना चाहता - केवल तभी जब यह या तो छंटनी या लाइन ब्रेक पोजिशन में बदलाव का कारण बनता है।

मैं इसका परीक्षण कैसे कर सकता हूं? परीक्षण उदाहरण 1, 2, और 3 के लिए हाँ वापस करना चाहिए, लेकिन उदाहरण के लिए नहीं 4.

नोट: आकार बदलने से मेरे उदाहरण में लाइनों की संख्या कभी नहीं बदलेगी।

नोट 2: यदि किसी के पास टेक्स्ट स्वरूपण से संबंधित कुछ बेहतर टैग हैं तो मुझे उन्हें जानना अच्छा लगेगा - संपादित करने के लिए स्वतंत्र महसूस करें।

नोट 3: यदि आप इस व्यवहार को पूरा करने में रुचि रखते हैं, तो आईफोन पर ऐप्पल के मेल.एप को आज़माएं। इनबॉक्स को देखते समय, एक ईमेल स्वाइप करें और सारांश रेखा को फीड-इन/आउट देखें क्योंकि यह फिर से लपेटता है और/या छंटनी करता है (लेकिन जब इसकी आवश्यकता नहीं होती है)।

उत्तर

2

आप किसी विशेष NSString उदाहरण को प्रदर्शित करने के लिए आवश्यक लेबल के आकार को जान सकते हैं। उदाहरण के लिए, आप इस्तेमाल कर सकते हैं एक है कि:

- (CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode

स्ट्रिंग के आकार देता है अगर यह निर्दिष्ट बाधाओं के साथ गाया गया था।

UILabel *label; 
    CGSize sizeNeeded = [label.text sizeWithFont:label.font constrainedToSize:CGSizeMake(label.bounds.size.width, MAXFLOAT)]; 
    if (sizeNeeded.height > label.bounds.size.height) 
    { 
     NSLog(@"String is truncated"); 
    } 

अधिक उपयोगी NSString तरीकों तुम यहाँ मिल सकता है: NSString UIKit Additions Reference

तो एक विशेष स्ट्रिंग के लिए CGSize हो और जांच करने के लिए अगर यह बड़ा नहीं तो UILabel आकार है कि आप क्या चाहते हैं

ठीक है, आप जो चाहते हैं उसे करने का एक और तरीका:

1) 2बनाएंएक ही गुण के साथ लेकिन दूसरा एक (label2) एक और width के साथ होगा।

2) alphalabel20.0 की गैर-संपादन मोड में सेट करें।

3) संपादन मोड शुरू होता है इस तरह के एनीमेशन बनाने:

// label1.alpha == 1.0, label2.alpha == 0.0 
{[UIView animateWithDuration:0.5 animations:^{ 
    label1.alpha = 0.0; 
    label2.alpha = 1.0; 
}]; 

4) जब संपादन मोड समाप्त होता है:

{[UIView animateWithDuration:0.5 animations:^{ 
    label1.alpha = 1.0; 
    label2.alpha = 0.0; 
}]; 

Mail.app

+0

मैं देख सकता हूं कि लेबल को छोटा कर दिया जाएगा या नहीं। लेकिन मुझे नहीं लगता कि यह मुझे उदाहरण 4 के लिए मदद करता है? रास्ते से लिंक के लिए धन्यवाद। –

+0

आपका क्या मतलब है? यह किसी भी मामले के लिए पूरी तरह से आपकी समस्या का समाधान करेगा। – Nekto

+0

आपने कहा: 'केवल तभी जब यह या तो छंटनी या लाइन ब्रेक पोजीशन में बदलाव का कारण बनता है'। मैं आपको यह भी जांचने के लिए कोड देता हूं। – Nekto

1
में के रूप में आप एक ही परिणाम दे देंगे कि

उपर्युक्त उत्तर एक अवमूल्यन विधि का उपयोग कर रहा है, इसलिए मैंने सोचा कि निम्न कोड उपयोगी हो सकता है:

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

लेबल आकार का अनुपात संख्याऑफलाइन से कैसे संबंधित है? मैं नहीं देख सकता कि यह कैसे काम करता है (यह निश्चित रूप से तब नहीं हुआ जब मैंने इसका परीक्षण किया) – aaroncatlin

1

इस विधि का उपयोग आईओएस 7.

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

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

यह काम करता है। Autolayout समाधान के लिए, http://stackoverflow.com/a/26510049/1418457 देखें – onmyway133

2

स्विफ्ट 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 
    } 
} 
संबंधित मुद्दे