iphone - UIlabel में अंडरलाइन टेक्स्ट




text underline (12)

NSUnderlineStyleAttributeName जो एक NSNumber लेता है (जहां 0 कोई रेखांकन नहीं है) को विशेषता शब्दकोश में जोड़ा जा सकता है। मुझे नहीं पता कि यह कोई आसान है या नहीं। लेकिन, मेरे उद्देश्यों के लिए यह आसान था।

    NSDictionary *attributes; 
    attributes = @{NSFontAttributeName:font,   NSParagraphStyleAttributeName: style, NSUnderlineStyleAttributeName:[NSNumber numberWithInteger:1]};

    [text drawInRect:CGRectMake(self.contentRect.origin.x, currentY, maximumSize.width, textRect.size.height) withAttributes:attributes];

मैं एक पाठ को रेखांकित कैसे कर सकता हूं जो स्ट्रिंग की कई पंक्तियां हो सकती है? मुझे लगता है कि कुछ लोग UIWebView का सुझाव देते हैं, लेकिन यह स्पष्ट रूप से टेक्स्ट प्रतिपादन के लिए एक वर्ग बहुत भारी है।

मेरे विचार प्रत्येक पंक्ति में प्रत्येक स्ट्रिंग के प्रारंभ बिंदु और लंबाई को समझना था। और तदनुसार इसके तहत एक रेखा खींचें।

मैं स्ट्रिंग के लिए लंबाई और प्रारंभ बिंदु को समझने के तरीके पर समस्याओं को पूरा करता हूं। क्या कोई इस पर मेरी मदद कर सकता है?

मैंने उपयोग करने की कोशिश की -[UILabel textRectForBounds:limitedToNumberOfLines:] , यह टेक्स्ट के लिए ड्राइंग बाउंडिंग रेक्ट होना चाहिए? तो मुझे संरेखण पर काम करना है? जब मैं केंद्र-उचित और सही उचित होता हूं तो मैं प्रत्येक पंक्ति का प्रारंभ बिंदु कैसे प्राप्त कर सकता हूं?

मैं यहां नया हूं, इसलिए अग्रिम धन्यवाद।


आप UILabel से उपclass कर सकते हैं और drawRect विधि ओवरराइड कर सकते हैं:

- (void)drawRect:(CGRect)rect {
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    CGContextSetRGBStrokeColor(ctx, 207.0f/255.0f, 91.0f/255.0f, 44.0f/255.0f, 1.0f); // RGBA
    CGContextSetLineWidth(ctx, 1.0f);

    CGContextMoveToPoint(ctx, 0, self.bounds.size.height - 1);
    CGContextAddLineToPoint(ctx, self.bounds.size.width, self.bounds.size.height - 1);

    CGContextStrokePath(ctx);

    [super drawRect:rect];  
}

युपीडी:
आईओएस 6 के रूप में ऐप्पल ने UILabel के लिए NSAttributedString समर्थन जोड़ा, तो अब यह बहुत आसान है और कई लाइनों के लिए काम करता है:

NSDictionary *underlineAttribute = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)};
myLabel.attributedText = [[NSAttributedString alloc] initWithString:@"Test string" 
                                                         attributes:underlineAttribute];

यदि आप अभी भी आईओएस 4 और आईओएस 5 का समर्थन करना चाहते हैं, तो मैं मैन्युअल रूप से लेबल को रेखांकित करने के बजाय TTTAttributedLabel लेबल का उपयोग करने की सलाह TTTAttributedLabel । हालांकि यदि आपको एक-लाइन UILabel को रेखांकित करने की आवश्यकता है और तीसरे पक्ष के घटकों का उपयोग नहीं करना चाहते हैं, तो उपरोक्त कोड अभी भी चाल करेगा।


एक और समाधान हो सकता है (आईओएस 7 के बाद से) ने NSBaselineOffsetAttributeName को नकारात्मक मान दिया है, उदाहरण के लिए आपका NSAttributedString हो सकता है:

NSAttributedString *attributedText = [[NSAttributedString alloc] initWithString:@"my text goes here'
                                                            attributes:@{NSFontAttributeName: [UIFont fontWithName:@"Helvetica-Regular" size:12],
                                                                         NSForegroundColorAttributeName: [UIColor blackColor],
                                                                         NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle), NSBaselineOffsetAttributeName: @(-3)}];

उम्मीद है कि यह मदद करेगा ;-)


एक विशेषता स्ट्रिंग का प्रयोग करें:

NSMutableAttributedString* attrString = [[NSMutableAttributedString alloc] initWithString:@"Your String"]
[attrString addAttribute:(NSString*)kCTUnderlineStyleAttributeName 
                   value:[NSNumber numberWithInt:kCTUnderlineStyleSingle] 
                   range:(NSRange){0,[attrString length]}];

और फिर लेबल को ओवरराइड करें - (शून्य) drawTextInRect: (CGRect) aRect और टेक्स्ट को इस तरह से प्रस्तुत करें:

CGContextRef ctx = UIGraphicsGetCurrentContext();
CGContextSaveGState(ctx);
CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef)attrString);
drawingRect = self.bounds;
CGMutablePathRef path = CGPathCreateMutable();
CGPathAddRect(path, NULL, drawingRect);
textFrame = CTFramesetterCreateFrame(framesetter,CFRangeMake(0,0), path, NULL);
CGPathRelease(path);
CFRelease(framesetter);
CTFrameDraw(textFrame, ctx);
CGContextRestoreGState(ctx);

या ओलिवियर हॉलिगॉन द्वारा निर्मित OHAttributedLabel उपयोग करने के बजाय अभी भी ओवरराइड करने के बजाय बेहतर है


कोवास के कोड का एक उन्नत संस्करण (रंग और रेखा आकार)

@implementation UILabelUnderlined

- (void)drawRect:(CGRect)rect {

    CGContextRef ctx = UIGraphicsGetCurrentContext();
    const CGFloat* colors = CGColorGetComponents(self.textColor.CGColor);

    CGContextSetRGBStrokeColor(ctx, colors[0], colors[1], colors[2], 1.0); // RGBA

    CGContextSetLineWidth(ctx, 1.0f);

    CGSize tmpSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(200, 9999)];

    CGContextMoveToPoint(ctx, 0, self.bounds.size.height - 1);
    CGContextAddLineToPoint(ctx, tmpSize.width, self.bounds.size.height - 1);

    CGContextStrokePath(ctx);

    [super drawRect:rect];  
}

@end

जैसा कि कोवास ने दिखाया है कि आप ज्यादातर मामलों में बाउंडिंग बॉक्स का उपयोग कर सकते हैं, हालांकि यह हमेशा गारंटी नहीं देता है कि बाउंडिंग बॉक्स पाठ के चारों ओर अच्छी तरह से फिट होगा। 50 की ऊंचाई वाला एक बॉक्स और 12 का फ़ॉन्ट आकार UILabel कॉन्फ़िगरेशन के आधार पर इच्छित परिणाम नहीं दे सकता है।

UILabel के भीतर UIString को सटीक मीट्रिक निर्धारित करने के लिए क्वेरी करें और इन्हें कोव्स द्वारा प्रदान किए गए ड्राइंग कोड का उपयोग करके संलग्न बाउंडिंग बॉक्स या फ्रेम के बावजूद अपनी अंडरलाइन को बेहतर स्थान पर रखने के लिए उपयोग करें।

आपको यूफॉन्ट की "अग्रणी" संपत्ति भी देखना चाहिए जो किसी विशेष फ़ॉन्ट के आधार पर बेसलाइन के बीच की दूरी प्रदान करता है। बेसलाइन वह जगह है जहां आप अपनी अंडरलाइन तैयार करना चाहते हैं।

एनएसएसटींग को यूआईकिट जोड़ों को देखें:

(CGSize)sizeWithFont:(UIFont *)font 
//Returns the size of the string if it were to be rendered with the specified font on a single line.

(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size 
// Returns the size of the string if it were rendered and constrained to the specified size.

(CGSize)sizeWithFont:(UIFont *)font constrainedToSize:(CGSize)size lineBreakMode:(UILineBreakMode)lineBreakMode
//Returns the size of the string if it were rendered with the specified constraints.

मैंने अंडरलाइन के साथ मल्टीलाइन यूलाबेल के लिए बनाया है:

फ़ॉन्ट आकार 8 से 13 सेट करने के लिए int lineHeight = self.font.point आकार + 3;

फ़ॉन्ट आकार 14 से 20 सेट int लाइन के लिए हेइट = self.font.point आकार + 4;

- (void)drawRect:(CGRect)rect 

{

CGContextRef ctx = UIGraphicsGetCurrentContext();

const CGFloat* colors = CGColorGetComponents(self.textColor.CGColor);

CGContextSetRGBStrokeColor(ctx, colors[0], colors[1], colors[2], 1.0); // RGBA

CGContextSetLineWidth(ctx, 1.0f);
CGSize tmpSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(self.frame.size.width, 9999)];

int height = tmpSize.height;

int lineHeight = self.font.pointSize+4;    

int maxCount = height/lineHeight;

float totalWidth = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(1000, 9999)].width;

for(int i=1;i<=maxCount;i++)

{

    float width=0.0;
    if((i*self.frame.size.width-totalWidth)<=0)
        width = self.frame.size.width;
    else
        width = self.frame.size.width - (i* self.frame.size.width - totalWidth);
    CGContextMoveToPoint(ctx, 0, lineHeight*i-1);
    CGContextAddLineToPoint(ctx, width, lineHeight*i-1);
}

CGContextStrokePath(ctx);

[super drawRect:rect]; 
}

मैंने बेहतर प्रदान करने के लिए कुछ प्रदान किए गए उत्तरों को जोड़ा है (कम से कम मेरी आवश्यकताओं के लिए) UILabel सबक्लास, जो समर्थन करता है:

  • विभिन्न लेबल सीमाओं के साथ बहुभाषी पाठ (पाठ लेबल फ्रेम के बीच में हो सकता है, या सटीक आकार)
  • रेखांकित करना
  • मिटाना
  • अंडरलाइन / स्ट्राइकआउट लाइन ऑफसेट
  • पाठ्य संरेखण
  • विभिन्न फ़ॉन्ट आकार

https://github.com/GuntisTreulands/UnderLineLabel


यहां एक और, सरल समाधान है (अंडरलाइन की चौड़ाई सबसे सटीक नहीं है लेकिन यह मेरे लिए काफी अच्छी थी)

मेरे पास UIView (_view_underline) है जिसमें सफेद पृष्ठभूमि है, 1 पिक्सेल की ऊंचाई है और जब भी मैं टेक्स्ट अपडेट करता हूं तो मैं इसकी चौड़ाई अपडेट करता हूं

// It's a shame you have to do custom stuff to underline text
- (void) underline  {
    float width = [[_txt_title text] length] * 10.0f;
    CGRect prev_frame = [_view_underline frame];
    prev_frame.size.width = width;
    [_view_underline setFrame:prev_frame];
}

यहां सबसे आसान समाधान है जो अतिरिक्त कोड लिखने के बिना मेरे लिए काम करता है।

// To underline text in UILable
NSMutableAttributedString *text = [[NSMutableAttributedString alloc] initWithString:@"Type your text here"];
[text addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, text.length)];
lblText.attributedText = text;

स्विफ्ट में:

    let underlineAttriString = NSAttributedString(string:"attriString", attributes:
        [NSUnderlineStyleAttributeName: NSUnderlineStyle.StyleSingle.rawValue])

    label.attributedText = underlineAttriString

NSMutableAttributedString *text = [self.myUILabel.attributedText mutableCopy];
[text addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, text.length)];
self.myUILabel.attributedText = text;




underline