दिलचस्प पोस्ट
रेगएक्स: उद्धरण चिह्नों के बीच मूल्यों को हथियाने साझा संदर्भ में अर्रे सूची सहेजें सबसे उपयोगी आर चाल क्या है? मुझे फ़ंक्शन हस्ताक्षर में std :: enable_if से क्यों बचने चाहिए? योसेमाइट / एल कैपिटन पीएचपी-जीडी + एमक्रीप्ट इंस्टॉलेशन OSX में बैटरी स्थिति? हाइबरनेट मानदंड: एक मैप किए गए एसोसिएशन के बिना टेबल में शामिल होना जावास्क्रिप्ट में वस्तु की तुलना अजगर कुंजीशब्द "के साथ" के लिए प्रयोग किया जाता है? स्ट्रिंग लिटरल संशोधित किसी प्रपत्र पर सभी नियंत्रणों के लिए एक क्लिक को संभालना कॉमा और बिंदु के साथ दोगुनी करने के लिए स्ट्रिंग पार्स करें कमांड लाइन से सी प्रोग्राम में तर्क दें एंड्रॉइड में छवि क्रॉप करें सूची फ़िल्टर कस्टम एडाप्टर न दें परिणाम दें

यूआईएलएबल में टेक्स्ट रेखांकित करें

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

मेरा विचार था कि प्रत्येक पंक्ति में प्रत्येक स्ट्रिंग की शुरुआती बिंदु और लंबाई पता करने के लिए। और उसके अनुसार एक रेखा खींचना।

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

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

मैं यहाँ नया हूँ, इसलिए आपको पहले से धन्यवाद

वेब के समाधान से एकत्रित समाधान "यूआईएलएबल में टेक्स्ट रेखांकित करें"

आप UILabel और ओवरराइड ड्रॉरेक्ट विधि से उपवर्ग कर सकते हैं:

 - (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 एपल के रूप में यूएलएबीएल के लिए एनएसएटीटीएटेड स्ट्रिंग का समर्थन जोड़ा गया है, इसलिए अब यह बहुत आसान है और कई लाइनों के लिए काम करता है:

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

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

यह जो मैंने किया है। यह मक्खन की तरह काम करता है

1) अपने फ्रेमवर्क में कोरटेक्स्ट। फ्रेमवर्क जोड़ें

2) उस क्लास में <CoreText / CoreText.h> आयात करें जहां आपको लेबल को रेखांकित करना पड़ता है

3) निम्न कोड लिखें

  NSMutableAttributedString *attString = [[NSMutableAttributedString alloc] initWithString:@"My Messages"]; [attString addAttribute:(NSString*)kCTUnderlineStyleAttributeName value:[NSNumber numberWithInt:kCTUnderlineStyleSingle] range:(NSRange){0,[attString length]}]; self.myMsgLBL.attributedText = attString; self.myMsgLBL.textColor = [UIColor whiteColor]; 

स्विफ्ट में:

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

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

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

और फिर लेबल ओवरराइड करें – (शून्य) drawTextInRect: (सीजीआरएक्ट) एआरएक्ट और कुछ में पाठ को प्रस्तुत करना:

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

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

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

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

https://github.com/GuntisTreulands/UnderLineLabel

लोग, जो दृश्य (UILabel / UIButton) आदि को उप-वर्ग नहीं बनाना चाहते हैं … 'भूल' बटन किसी भी योग्य द्वारा भी बदल सकते हैं

 -(void) drawUnderlinedLabel { NSString *string = [forgetButton titleForState:UIControlStateNormal]; CGSize stringSize = [string sizeWithFont:forgetButton.titleLabel.font]; CGRect buttonFrame = forgetButton.frame; CGRect labelFrame = CGRectMake(buttonFrame.origin.x + buttonFrame.size.width - stringSize.width, buttonFrame.origin.y + stringSize.height + 1 , stringSize.width, 2); UILabel *lineLabel = [[UILabel alloc] initWithFrame:labelFrame]; lineLabel.backgroundColor = [UIColor blackColor]; //[forgetButton addSubview:lineLabel]; [self.view addSubview:lineLabel]; } 
 NSString *tem =self.detailCustomerCRMCaseLabel.text; if (tem != nil && ![tem isEqualToString:@""]) { NSMutableAttributedString *temString=[[NSMutableAttributedString alloc]initWithString:tem]; [temString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInt:1] range:(NSRange){0,[temString length]}]; self.detailCustomerCRMCaseLabel.attributedText = temString; } 

एक अन्य समाधान हो सकता है (आईओएस 7 के बाद से) NSBaselineOffsetAttributeName लिए एक नकारात्मक मान दिया 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 *text = [self.myUILabel.attributedText mutableCopy]; [text addAttribute:NSUnderlineStyleAttributeName value:@(NSUnderlineStyleSingle) range:NSMakeRange(0, text.length)]; self.myUILabel.attributedText = text; 

आप नाम के साथ एक कस्टम लेबल नाम रेखांकित लेबेल और drawRect फ़ंक्शन को संपादित कर सकते हैं।

 #import "UnderlinedLabel.h" @implementation UnderlinedLabel - (void)drawRect:(CGRect)rect { NSString *normalTex = self.text; NSDictionary *underlineAttribute = @{NSUnderlineStyleAttributeName: @(NSUnderlineStyleSingle)}; self.attributedText = [[NSAttributedString alloc] initWithString:normalTex attributes:underlineAttribute]; [super drawRect:rect]; } 

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

 // 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; 

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

 @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 

मैं रेखांकित साथ multiline uilabel के लिए बनाया है:

फ़ॉन्ट आकार के लिए 8 से 13 सेट इंट लाइनहाइट = self.font.pointSize + 3;

फ़ॉन्ट आकार के लिए 14 से 20 सेट इंट लाइनहाइट = self.font.pointSize + 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]; } 

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

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

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

यूआईकिट के अतिरिक्त एनएसएसटीइंग को देखें:

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

मैं एक ओपन सोर्स लाइन दृश्य का उपयोग करता हूँ और बस इसे बटन सबव्यूज़ में जोड़ा है:

  UILabel *label = termsButton.titleLabel; CGRect frame = label.frame; frame.origin.y += frame.size.height - 1; frame.size.height = 1; SSLineView *line = [[SSLineView alloc] initWithFrame:frame]; line.lineColor = [UIColor lightGrayColor]; [termsButton addSubview:line]; 

यह ऊपर करीम से प्रेरित था

कोवस एंड डेमियन प्रेका के उत्तर के आधार पर, यहां यूआईएलएबल यू सरलाइन्ड का कार्यान्वयन किया गया है जो टेक्स्ट एलाइजाइन का समर्थन करता है

 #import <UIKit/UIKit.h> @interface UILabelUnderlined : UILabel @end 

और कार्यान्वयन:

 #import "UILabelUnderlined.h" @implementation DKUILabel - (id)initWithFrame:(CGRect)frame { self = [super initWithFrame:frame]; if (self) { // Initialization code } return self; } - (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 textSize = [self.text sizeWithFont:self.font constrainedToSize:CGSizeMake(200, 9999)]; // handle textAlignement int alignementXOffset = 0; switch (self.textAlignment) { case UITextAlignmentLeft: break; case UITextAlignmentCenter: alignementXOffset = (self.frame.size.width - textSize.width)/2; break; case UITextAlignmentRight: alignementXOffset = self.frame.size.width - textSize.width; break; } CGContextMoveToPoint(ctx, alignementXOffset, self.bounds.size.height - 1); CGContextAddLineToPoint(ctx, alignementXOffset+textSize.width, self.bounds.size.height - 1); CGContextStrokePath(ctx); [super drawRect:rect]; } @end 

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

मेरे पास एक 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]; } 

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];