2010-11-04 11 views
12

क्या शब्द लपेटा UILabel में पाठ का दृश्य भाग प्राप्त करने का कोई तरीका है? मेरा मतलब बिल्कुल आखिरी दृश्य चरित्र है?UILabel पाठ का दृश्य भाग

मैं छवि को गोल करने के लिए दो लेबल बनाना चाहता हूं और दूसरे पाठ पर पहले लेबल के लिए पाठ से बाहर पाठ जारी रखना चाहता हूं।

मुझे [NSString sizeWithFont...] पता है, लेकिन [NSString stringVisibleInRect: withFont:...] जैसे कुछ उलट रहे हैं? :-)

अग्रिम धन्यवाद। (लॉग एन) iOS 7 एपीआई के साथ विधि

उत्तर

7

आप NSString विस्तार करने के लिए एक वर्ग का उपयोग करें और विधि बना सकते हैं आप का उल्लेख

@interface NSString (visibleText) 

- (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font; 

@end 

@implementation NSString (visibleText) 

- (NSString*)stringVisibleInRect:(CGRect)rect withFont:(UIFont*)font 
{ 
    NSString *visibleString = @""; 
    for (int i = 1; i <= self.length; i++) 
    { 
     NSString *testString = [self substringToIndex:i]; 
     CGSize stringSize = [testString sizeWithFont:font]; 
     if (stringSize.height > rect.size.height || stringSize.width > rect.size.width) 
      break; 

     visibleString = testString; 
    } 
    return visibleString; 
} 

@end 
+1

हाय! धन्यवाद दोस्त। लेकिन मुझे ऐसा लगता है कि लूप के साथ यह विधि बहुत भारी है। मैं कुछ मूल खोजना चाहता हूँ। – Evgeny

+0

मुझे यह मूल रूप से करने के तरीके से अवगत नहीं है। जब तक आप इस कोड को एक बड़ी राशि नहीं बुलाएंगे, तो मुझे कल्पना नहीं होगी कि इससे आपके ऐप पर कोई नकारात्मक प्रभाव पड़ेगा। यदि आप स्मृति उपयोग के बारे में वास्तव में चिंतित हैं तो आप आवंटन को देख सकते हैं और सभी स्ट्रिंग इंस्टेंस जारी कर सकते हैं। – Vertism

+1

मैं स्मृति के बारे में चिंता नहीं कर रहा हूं बल्कि प्रोसेसर लोड कर रहा हूं। ऐसा लगता है कि आकार WithFont वास्तव में भारी होना चाहिए और मुझे आश्चर्य हुआ कि उदाहरण के लिए, UILabel घटना जब यह कुछ पाठ दूर करती है ... यह मेरा सवाल था :-) लेकिन ऐसा लगता है कि वहां कोई समाधान नहीं है एकमात्र रास्ता तुम्हारा है। – Evgeny

0

यहाँ एक हे है। केवल सतही परीक्षण किया गया है, अगर आपको कोई भी बग मिलती है तो कृपया टिप्पणी करें।

- (NSRange)hp_visibleRange 
{ 
    NSString *text = self.text; 
    NSRange visibleRange = NSMakeRange(NSNotFound, 0); 
    const NSInteger max = text.length - 1; 
    if (max >= 0) 
    { 
     NSInteger next = max; 
     const CGSize labelSize = self.bounds.size; 
     const CGSize maxSize = CGSizeMake(labelSize.width, CGFLOAT_MAX); 
     NSMutableParagraphStyle *paragraphStyle = [[NSParagraphStyle defaultParagraphStyle] mutableCopy]; 
     paragraphStyle.lineBreakMode = self.lineBreakMode; 
     NSDictionary * attributes = @{NSFontAttributeName:self.font, NSParagraphStyleAttributeName:paragraphStyle}; 
     NSInteger right; 
     NSInteger best = 0; 
     do 
     { 
      right = next; 
      NSRange range = NSMakeRange(0, right + 1); 
      NSString *substring = [text substringWithRange:range]; 
      CGSize textSize = [substring boundingRectWithSize:maxSize 
                 options:NSStringDrawingUsesLineFragmentOrigin 
                attributes:attributes 
                 context:nil].size; 
      if (textSize.width <= labelSize.width && textSize.height <= labelSize.height) 
      { 
       visibleRange = range; 
       best = right; 
       next = right + (max - right)/2; 
      } else if (right > 0) 
      { 
       next = right - (right - best)/2; 
      } 
     } while (next != right); 
    } 
    return visibleRange; 
} 
+0

मुझे लगता है कि मैंने CoreText को मारने के संबंध में ओ (1) के साथ आपको हराया है: http://stackoverflow.com/a/25899300/860000 –