मैं UILabel डिस्प्ले उल्लिखित पाठ कैसे बनाऊँ?


108

मैं चाहता हूँ कि मेरे सफेद UILabel पाठ के चारों ओर एक पिक्सेल काली सीमा हो।

मुझे नीचे दिए गए कोड के साथ UILabel को उप-वर्ग के रूप में मिला, जिसे मैंने कुछ मूर्त रूप से संबंधित ऑनलाइन उदाहरणों से एक साथ सिलवाया था। और यह काम करता है लेकिन यह बहुत, बहुत धीमा है (सिम्युलेटर को छोड़कर) और मैं इसे टेक्स्ट को लंबवत रूप से केंद्र में लाने के लिए नहीं मिल सका (इसलिए मैंने अस्थायी रूप से अंतिम पंक्ति में y मान को हार्ड-कोडित किया है)। Ahhhh!

void ShowStringCentered(CGContextRef gc, float x, float y, const char *str) {
    CGContextSetTextDrawingMode(gc, kCGTextInvisible);
    CGContextShowTextAtPoint(gc, 0, 0, str, strlen(str));
    CGPoint pt = CGContextGetTextPosition(gc);

    CGContextSetTextDrawingMode(gc, kCGTextFillStroke);

    CGContextShowTextAtPoint(gc, x - pt.x / 2, y, str, strlen(str));
}


- (void)drawRect:(CGRect)rect{

    CGContextRef theContext = UIGraphicsGetCurrentContext();
    CGRect viewBounds = self.bounds;

    CGContextTranslateCTM(theContext, 0, viewBounds.size.height);
    CGContextScaleCTM(theContext, 1, -1);

    CGContextSelectFont (theContext, "Helvetica", viewBounds.size.height,  kCGEncodingMacRoman);

    CGContextSetRGBFillColor (theContext, 1, 1, 1, 1);
    CGContextSetRGBStrokeColor (theContext, 0, 0, 0, 1);
    CGContextSetLineWidth(theContext, 1.0);

    ShowStringCentered(theContext, rect.size.width / 2.0, 12, [[self text] cStringUsingEncoding:NSASCIIStringEncoding]);
}

मुझे बस इतना लग रहा है कि मैं ऐसा करने का एक सरल तरीका देख रहा हूं। शायद "drawTextInRect" को ओवरराइड करने से, लेकिन मैं अपनी इच्छाशक्ति को पूरी तरह से घूरने और वास्तव में बहुत कठिन रूप से डूबने के बावजूद अपनी इच्छा से झुकने के लिए drawTextInRect प्राप्त नहीं कर सकता।


स्पष्टता - मेरे ऐप में सुस्ती स्पष्ट है क्योंकि मैं लेबल को एनिमेट कर रहा हूं जब इसका मूल्य थोड़ा बढ़ता है और सिकुड़ता है। सब-क्लॉसिंग के बिना यह सुचारू है, लेकिन लेबल एनीमेशन के ऊपर कोड के साथ रास्ता तड़का हुआ है। क्या मुझे बस UIWebView का उपयोग करना चाहिए? मुझे लगता है कि ऐसा करना मूर्खतापूर्ण है क्योंकि लेबल केवल एक ही नंबर प्रदर्शित कर रहा है ...
मोंटे हर्ड

ठीक है, यह प्रदर्शन समस्या की तरह दिखता है जो मुझे आउटलाइन कोड से असंबंधित था, लेकिन मैं अभी भी इसे लंबवत संरेखित करने के लिए प्राप्त नहीं कर सकता। pt.y किसी कारण से हमेशा शून्य होता है।
मोंटे हर्र्ड

जवाबों:


164

मैं ड्राट्रैक इनरक्ट को ओवरराइड करके इसे करने में सक्षम था:

- (void)drawTextInRect:(CGRect)rect {

  CGSize shadowOffset = self.shadowOffset;
  UIColor *textColor = self.textColor;

  CGContextRef c = UIGraphicsGetCurrentContext();
  CGContextSetLineWidth(c, 1);
  CGContextSetLineJoin(c, kCGLineJoinRound);

  CGContextSetTextDrawingMode(c, kCGTextStroke);
  self.textColor = [UIColor whiteColor];
  [super drawTextInRect:rect];

  CGContextSetTextDrawingMode(c, kCGTextFill);
  self.textColor = textColor;
  self.shadowOffset = CGSizeMake(0, 0);
  [super drawTextInRect:rect];

  self.shadowOffset = shadowOffset;

}

3
मैंने इस तकनीक की कोशिश की लेकिन परिणाम संतोषजनक से कम हैं। अपने iPhone 4 पर मैंने काले रंग की रूपरेखा के साथ सफेद पाठ को आकर्षित करने के लिए इस कोड का उपयोग करने की कोशिश की। मुझे जो मिला वह पाठ के प्रत्येक अक्षर के बाएं और दाएं किनारों पर ब्लैक आउटलाइन था, लेकिन शीर्ष या नीचे की रूपरेखा नहीं थी। कोई विचार?
माइक हर्शबर्ग

खेद है कि मैं अपने प्रोजेक्ट पर आपके कोड का उपयोग करने की कोशिश कर रहा हूं, लेकिन ऐसा कुछ नहीं होता है! इस तस्वीर को देखें: लिंक
मोमी

@ मेमोक्स: आपको उप-विभाजन करना होगा UILabelऔर -drawTextInRect:वहां क्रियान्वयन करना होगा।
जेफ केली

1
@ मेमोक्स: यदि आप नहीं जानते कि ऑब्जेक्टिव-सी में सबक्लास कैसे बनाया जाए, तो आपको कुछ गोलगप्पे खाने चाहिए; Apple के पास ऑब्जेक्टिव-सी लैंग्वेज की गाइड है।
जेफ केली

1
शायद - मुझे नहीं लगता कि जब मैं 2.5 साल पहले यह लिखा था, तब अस्तित्व में था :)
kprevas

114

एक सरल समाधान एक तरह से एक स्ट्रिंग का उपयोग करना है:

स्विफ्ट 4:

let strokeTextAttributes: [NSAttributedStringKey : Any] = [
    NSAttributedStringKey.strokeColor : UIColor.black,
    NSAttributedStringKey.foregroundColor : UIColor.white,
    NSAttributedStringKey.strokeWidth : -2.0,
    ]

myLabel.attributedText = NSAttributedString(string: "Foo", attributes: strokeTextAttributes)

स्विफ्ट 4.2:

let strokeTextAttributes: [NSAttributedString.Key : Any] = [
    .strokeColor : UIColor.black,
    .foregroundColor : UIColor.white,
    .strokeWidth : -2.0,
    ]

myLabel.attributedText = NSAttributedString(string: "Foo", attributes: strokeTextAttributes)

पर UITextFieldआप defaultTextAttributesऔर attributedPlaceholderसाथ ही सेट कर सकते हैं ।

ध्यान दें कि इस मामले में NSStrokeWidthAttributeName नकारात्मक होना चाहिए , अर्थात केवल आंतरिक रूपरेखा काम करती है।

UITextFields जिम्मेदार ग्रंथों का उपयोग करते हुए एक रूपरेखा के साथ


17
ऑब्जेक्टिव-सी में सुविधा के लिए यह होगा: label.attributedText = [[NSAttributedString आवंटन] initWithString: @ "स्ट्रिंग" विशेषताएँ: @ {NSStrokeColorAttributeName: [UIColor blackColor], NSForegroundColorAttributeName: UICPA White ;
लेसज़ेक सजरी

8
इस मेम के उपयोग ने प्रभावी ढंग से इस दृष्टिकोण की बारीकियों को सूचित किया
woody121

स्विफ्ट 4.2: strokeTextAttributes करते हैं: [स्ट्रिंग: किसी भी] = [NSStrokeColorAttributeName: UIColor.black, NSForegroundColorAttributeName: UIColor.white, NSStrokeWidthAttributeName: -4.0,] consoleView.typingAttributes = strokeTextAttributes
टेओ सर्टोरी

धन्यवाद @TeoSartori, मैंने अपने जवाब में स्विफ्ट 4.2 सिंटैक्स जोड़ा;)
एक्सल गुइलमिन

25

स्वीकृत उत्तर और उसके लिए दो सुधारों और एक्सल गुइलमिन के उत्तर को पढ़ने के बाद, मैंने स्विफ्ट में एक समग्र समाधान संकलित करने का फैसला किया, जो मुझे सूट करता है:

import UIKit

class UIOutlinedLabel: UILabel {

    var outlineWidth: CGFloat = 1
    var outlineColor: UIColor = UIColor.whiteColor()

    override func drawTextInRect(rect: CGRect) {

        let strokeTextAttributes = [
            NSStrokeColorAttributeName : outlineColor,
            NSStrokeWidthAttributeName : -1 * outlineWidth,
        ]

        self.attributedText = NSAttributedString(string: self.text ?? "", attributes: strokeTextAttributes)
        super.drawTextInRect(rect)
    }
}

आप इंटरफ़ेस बिल्डर में एक मौजूदा लेबल के लिए इस कस्टम UILabel वर्ग को जोड़ सकते हैं और उपयोगकर्ता परिभाषित रनटाइम विशेषताओं को जोड़कर सीमा और उसके रंग को बदल सकते हैं: इंटरफ़ेस बिल्डर सेटअप

परिणाम:

रूपरेखा के साथ बड़ा लाल जी


1
अच्छा लगा। मैं इसके साथ एक IBInspectable बनाऊंगा :)
मेरियो कारवाल्हो

@ लाचेजर इसे यूआईब्यूटन के पाठ के साथ कैसे किया जा सकता है?
क्रेज़ीऑन

8

उत्तर के कार्यान्वयन के साथ एक मुद्दा है। स्ट्रोक के साथ एक पाठ को खींचने में स्ट्रोक के बिना पाठ को खींचने की तुलना में थोड़ा अलग चरित्र का ग्लिफ़ चौड़ाई है, जो "अनियंत्रित" परिणाम पैदा कर सकता है। इसे फिल टेक्स्ट के चारों ओर एक अदृश्य स्ट्रोक जोड़कर ठीक किया जा सकता है।

बदलने के:

CGContextSetTextDrawingMode(c, kCGTextFill);
self.textColor = textColor;
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];

साथ में:

CGContextSetTextDrawingMode(context, kCGTextFillStroke);
self.textColor = textColor;
[[UIColor clearColor] setStroke]; // invisible stroke
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];

मैं 100% निश्चित नहीं हूं, अगर यह वास्तविक सौदा है, क्योंकि मुझे नहीं पता कि क्या self.textColor = textColor;इसका उतना ही प्रभाव है [textColor setFill], लेकिन यह काम करना चाहिए।

प्रकटीकरण: मैं THLabel का डेवलपर हूं।

मैंने कुछ समय पहले एक यूबेल उपवर्ग जारी किया है, जो पाठ और अन्य प्रभावों की रूपरेखा की अनुमति देता है। आप इसे यहाँ पा सकते हैं: https://github.com/tobihagemann/THLabel


4
बस इस्तेमाल किया THLabel, जीवन के रूप में यह काफी जटिल है
प्रात:

1
THLabel के लिए धन्यवाद, मैं कोड की सिर्फ दो पंक्तियों को जोड़कर पाठ के चारों ओर एक रूपरेखा तैयार करने में सक्षम था। एक समस्या का समाधान प्रदान करने के लिए धन्यवाद, जिस तरह से मैं बहुत लंबे समय से हल करने की कोशिश कर रहा हूं!
एलन किन्नमन

मुझे आश्चर्य है कि किसी ने भी ध्यान नहीं दिया, लेकिन अंतर्निहित पाठ स्ट्रोक कमांड, एक रूपरेखा नहीं बनाता है, लेकिन इसके बजाय यह एक " इनलाइन " बनाता है - यानी स्ट्रोक अक्षरों के अंदर पर खींचा जाता है, बाहर पर नहीं। THLabel से हम वास्तव में बाहर की तरफ खींचे गए स्ट्रोक को चुन सकते हैं। अच्छा काम!
लीनोहो

5

यह प्रति-बाह्यरेखा नहीं बनाएगा, लेकिन यह पाठ के चारों ओर एक छाया डाल देगा, और यदि आप छाया त्रिज्या को छोटा बनाते हैं तो यह एक रूपरेखा जैसा हो सकता है।

label.layer.shadowColor = [[UIColor blackColor] CGColor];
label.layer.shadowOffset = CGSizeMake(0.0f, 0.0f);
label.layer.shadowOpacity = 1.0f;
label.layer.shadowRadius = 1.0f;

मुझे नहीं पता कि यह iOS के पुराने संस्करणों के साथ संगत है या नहीं।

वैसे भी, मुझे आशा है कि यह मदद करता है ...


9
यह लेबल के चारों ओर एक पिक्सेल बॉर्डर नहीं है। यह नीचे तक सरल ड्रॉप छाया है।
टिम

1
यह गलत समाधान है। अच्छा भगवान जो इसे चिह्नित किया ?!
सैम बी

उन्होंने स्पष्ट रूप से 'रेखांकित' कहा, यह एक छाया है। सवाल का जवाब नहीं देता
मारा

5

एक स्विफ्ट 4 वर्ग संस्करण kprevas द्वारा जवाब के आधार पर

import Foundation
import UIKit

public class OutlinedText: UILabel{
    internal var mOutlineColor:UIColor?
    internal var mOutlineWidth:CGFloat?

    @IBInspectable var outlineColor: UIColor{
        get { return mOutlineColor ?? UIColor.clear }
        set { mOutlineColor = newValue }
    }

    @IBInspectable var outlineWidth: CGFloat{
        get { return mOutlineWidth ?? 0 }
        set { mOutlineWidth = newValue }
    }    

    override public func drawText(in rect: CGRect) {
        let shadowOffset = self.shadowOffset
        let textColor = self.textColor

        let c = UIGraphicsGetCurrentContext()
        c?.setLineWidth(outlineWidth)
        c?.setLineJoin(.round)
        c?.setTextDrawingMode(.stroke)
        self.textColor = mOutlineColor;
        super.drawText(in:rect)

        c?.setTextDrawingMode(.fill)
        self.textColor = textColor
        self.shadowOffset = CGSize(width: 0, height: 0)
        super.drawText(in:rect)

        self.shadowOffset = shadowOffset
    }
}

इसे पूरी तरह से इंटरफ़ेस बिल्डर में यूआईबेल के कस्टम वर्ग को आउटलाइनटेड पर सेट करके लागू किया जा सकता है। फिर आपके पास गुण फलक से रूपरेखा की चौड़ाई और रंग सेट करने की क्षमता होगी।

यहां छवि विवरण दर्ज करें


स्विफ्ट 5 के लिए भी सही।
अनीति86

4

यदि आप कुछ जटिल करना चाहते हैं, तो सबसे अच्छा तरीका यह है कि इसके बजाय एक चेतन का स्क्रीनशॉट लें!

किसी दृश्य का स्क्रीनशॉट लेने के लिए, आपको इस तरह कोड की आवश्यकता होगी:

UIGraphicsBeginImageContext(mainContentView.bounds.size);
[mainContentView.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext(); 

जहाँ mainContentView वह दृश्य है जिसका आप स्क्रीनशॉट लेना चाहते हैं। UIImageView में दृश्य जोड़ें और उसे चेतन करें।

आशा है कि अपने एनीमेशन को गति!

एन


यह एक भयानक चाल है जिसका उपयोग करने के लिए मैं कुछ स्थानों के बारे में सोच सकता हूं, और शायद प्रदर्शन के मुद्दे को हल करता हूं, लेकिन मैं अभी भी आशा व्यक्त कर रहा हूं कि मेरे भद्दे उपवर्गों की तुलना में एक सरल तरीका है जो कि यूलेबेल पाठ को एक रूपरेखा दिखाने के लिए है। इस समय में मैं आपके उदाहरण के साथ खेलने वाला हूँ धन्यवाद!
मोंटे हर्र्ड

मै तुम्हारा दर्द समझ सकता हू। मुझे यकीन नहीं है कि आपको ऐसा करने का एक अच्छा तरीका मिल जाएगा। मैं अक्सर उत्पाद प्रभावों के लिए कोड के बारे में लिखता हूं, फिर चिकनी एनीमेशन के लिए उन्हें (जैसे ऊपर) स्नैपशॉट देता हूं! ऊपर दिए गए उदाहरण के लिए आपको अपने कोड में <QuartzCore / QuartzCore.h> को शामिल करना होगा! शुभकामनाएँ! N
निक कार्टराइट

4

जैसा कि MuscleRumble ने उल्लेख किया है, स्वीकृत उत्तर की सीमा केंद्र से थोड़ी दूर है। मैं स्पष्ट रंग बदलने के बजाय स्ट्रोक की चौड़ाई को शून्य पर सेट करके इसे ठीक करने में सक्षम था।

इसकी जगह:

CGContextSetTextDrawingMode(c, kCGTextFill);
self.textColor = textColor;
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];

साथ में:

CGContextSetTextDrawingMode(c, kCGTextFillStroke);
self.textColor = textColor;
CGContextSetLineWidth(c, 0); // set stroke width to zero
self.shadowOffset = CGSizeMake(0, 0);
[super drawTextInRect:rect];

मैंने उनके जवाब पर सिर्फ टिप्पणी की होगी, लेकिन जाहिर है कि मैं पर्याप्त "प्रतिष्ठित" नहीं हूं।


2

अगर आप चाहते हैं कि मेरे सफेद उलीबेल पाठ के चारों ओर एक पिक्सेल काली सीमा हो,

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

- (void)drawRect:(CGRect)rect
{
  [super drawRect:rect];
  [context frameRect:rect]; // research which rect drawing function to use...
}

मुझे नहीं मिला। शायद इसलिए कि मैं स्क्रीन पर लगभग 12 घंटे से घूर रहा हूं और मुझे इस समय ज्यादा कुछ नहीं मिला ...
मोंटे हर्र्ड

आप UILabel को उपवर्गित कर रहे हैं, एक ऐसा वर्ग जो पहले से ही पाठ बनाता है। और जिस कारण से आप उपवर्ग कर रहे हैं, क्योंकि आप पाठ के चारों ओर एक काली सीमा जोड़ना चाहते हैं। इसलिए यदि आप सुपरक्लास को पाठ को आकर्षित करने देते हैं, तो आपको बस इतना करना है कि सीमा खींचना है, नहीं?
केंट

यह एक अच्छा बिंदु है ... हालांकि, अगर वह 1 पिक्सेल काली सीमा जोड़ना चाहता है, तो उपवर्ग संभवतः पत्रों को बहुत करीब से खींचेगा! .... मैं मूल प्रश्न और अनुकूलन (मेरी पोस्ट में बताई गई) की तरह कुछ करना चाहूँगा! N
निक कार्टराइट

@nickcartwright: यदि मामला ऐसा होता है कि सुपरक्लास जैसा आप कह रहे हैं, आप [सुपर ड्रॉक्ट] को कॉल करने से पहले CGRect को इनसेट कर सकते हैं। सुपरक्लास की कार्यक्षमता को फिर से लिखने की तुलना में अभी भी आसान और सुरक्षित है।
kent

और फिर @kent ने निराशा में SO को छोड़ दिया। शानदार जवाब, +1।
दान रोसेनस्टार्क

1

मुझे मुख्य उत्तर के साथ एक मुद्दा मिला। पाठ की स्थिति आवश्यक रूप से उप-पिक्सेल स्थान पर सही ढंग से केंद्रित नहीं है, ताकि पाठ के चारों ओर रूपरेखा को बेमेल किया जा सके। मैंने इसे निम्नलिखित कोड का उपयोग करके तय किया, जो उपयोग करता है CGContextSetShouldSubpixelQuantizeFonts(ctx, false):

- (void)drawTextInRect:(CGRect)rect
{
    CGContextRef ctx = UIGraphicsGetCurrentContext();

    [self.textOutlineColor setStroke];
    [self.textColor setFill];

    CGContextSetShouldSubpixelQuantizeFonts(ctx, false);

    CGContextSetLineWidth(ctx, self.textOutlineWidth);
    CGContextSetLineJoin(ctx, kCGLineJoinRound);

    CGContextSetTextDrawingMode(ctx, kCGTextStroke);
    [self.text drawInRect:rect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment];

    CGContextSetTextDrawingMode(ctx, kCGTextFill);
    [self.text drawInRect:rect withFont:self.font lineBreakMode:NSLineBreakByWordWrapping alignment:self.textAlignment];
}

यह मानता है कि आपने परिभाषित किया है textOutlineColorऔर textOutlineWidthगुणों के रूप में।


0

यहां लेबल पर उल्लिखित पाठ सेट करने का एक और जवाब है।

extension UILabel {

func setOutLinedText(_ text: String) {
    let attribute : [NSAttributedString.Key : Any] = [
        NSAttributedString.Key.strokeColor : UIColor.black,
        NSAttributedString.Key.foregroundColor : UIColor.white,
        NSAttributedString.Key.strokeWidth : -2.0,
        NSAttributedString.Key.font : UIFont.boldSystemFont(ofSize: 12)
        ] as [NSAttributedString.Key  : Any]

    let customizedText = NSMutableAttributedString(string: text,
                                                   attributes: attribute)
    attributedText = customizedText
 }

}

केवल विस्तार विधि का उपयोग करके उल्लिखित पाठ सेट करें।

lblTitle.setOutLinedText("Enter your email address or username")

0

निम्नलिखित तर्क के साथ UILabel को उप-लिंक करना भी संभव है:

- (void)setText:(NSString *)text {
    [self addOutlineForAttributedText:[[NSAttributedString alloc] initWithString:text]];
}

- (void)setAttributedText:(NSAttributedString *)attributedText {
    [self addOutlineForAttributedText:attributedText];
}

- (void)addOutlineForAttributedText:(NSAttributedString *)attributedText {
    NSDictionary *strokeTextAttributes = @{
                                           NSStrokeColorAttributeName: [UIColor blackColor],
                                           NSStrokeWidthAttributeName : @(-2)
                                           };

    NSMutableAttributedString *attrStr = [[NSMutableAttributedString alloc] initWithAttributedString:attributedText];
    [attrStr addAttributes:strokeTextAttributes range:NSMakeRange(0, attrStr.length)];

    super.attributedText = attrStr;
}

और यदि आप स्टोरीबोर्ड में पाठ सेट करते हैं तो:

- (instancetype)initWithCoder:(NSCoder *)aDecoder {

    self = [super initWithCoder:aDecoder];
    if (self) {
        // to apply border for text from storyboard
        [self addOutlineForAttributedText:[[NSAttributedString alloc] initWithString:self.text]];
    }
    return self;
}

0

यदि आपका लक्ष्य कुछ इस तरह है:

यहां छवि विवरण दर्ज करें

यहां बताया गया है कि मैंने इसे कैसे हासिल किया: मैंने labelअपने वर्तमान UILabel (इस उत्तर से प्रेरित ) के लिए एक कस्टम क्लास के एक नए को सबव्यू के रूप में जोड़ा ।

बस अपनी परियोजना में इसे कॉपी और पेस्ट करें और आप जाने के लिए अच्छे हैं:

extension UILabel {
    func addTextOutline(usingColor outlineColor: UIColor, outlineWidth: CGFloat) {
        class OutlinedText: UILabel{
            var outlineWidth: CGFloat = 0
            var outlineColor: UIColor = .clear

            override public func drawText(in rect: CGRect) {
                let shadowOffset = self.shadowOffset
                let textColor = self.textColor

                let c = UIGraphicsGetCurrentContext()
                c?.setLineWidth(outlineWidth)
                c?.setLineJoin(.round)
                c?.setTextDrawingMode(.stroke)
                self.textAlignment = .center
                self.textColor = outlineColor
                super.drawText(in:rect)

                c?.setTextDrawingMode(.fill)
                self.textColor = textColor
                self.shadowOffset = CGSize(width: 0, height: 0)
                super.drawText(in:rect)

                self.shadowOffset = shadowOffset
            }
        }

        let textOutline = OutlinedText()
        let outlineTag = 9999

        if let prevTextOutline = viewWithTag(outlineTag) {
            prevTextOutline.removeFromSuperview()
        }

        textOutline.outlineColor = outlineColor
        textOutline.outlineWidth = outlineWidth
        textOutline.textColor = textColor
        textOutline.font = font
        textOutline.text = text
        textOutline.tag = outlineTag

        sizeToFit()
        addSubview(textOutline)
        textOutline.frame = CGRect(x: -(outlineWidth / 2), y: -(outlineWidth / 2),
                                   width: bounds.width + outlineWidth,
                                   height: bounds.height + outlineWidth)
    }
}

उपयोग:

yourLabel.addTextOutline(usingColor: .red, outlineWidth: 6)

यह UIButtonअपने सभी एनिमेशनों के साथ भी काम करता है :

yourButton.titleLabel?.addTextOutline(usingColor: .red, outlineWidth: 6)

-3

आप फ़ोटोशॉप में 1px सीमा का यूवीवाईवाई क्यों नहीं बनाते हैं, फिर छवि के साथ एक यूआईईवीवाई सेट करें, और इसे अपने यूआईबेल के पीछे रखें?

कोड:

UIView *myView;
UIImage *imageName = [UIImage imageNamed:@"1pxBorderImage.png"];
UIColor *tempColour = [[UIColor alloc] initWithPatternImage:imageName];
myView.backgroundColor = tempColour;
[tempColour release];

यह आपको किसी वस्तु को उपवर्ग में सहेजने वाला है और ऐसा करना काफी सरल है।

यह उल्लेख करने के लिए नहीं कि क्या आप एनीमेशन करना चाहते हैं, यह UIView वर्ग में निर्मित है।


लेबल पर पाठ बदलता है और मुझे पाठ की आवश्यकता है कि 1 पिक्सेल काली रूपरेखा हो। (बाकी उबेलबेल की पृष्ठभूमि पारदर्शी है।)
मोंटे हर्ड

मुझे लगा कि मैं समझ गया हूं कि इससे यूआईबेल में किसी भी पाठ को कैसे रेखांकित किया जाएगा, लेकिन मैं नाजुक रूप से थका हुआ था और अब मैं अपने दिमाग को इधर-उधर लपेट नहीं सकता कि यह कैसे पूरा हो सकता है। मैं initWithPatternImage पर पढ़ने जा रहा हूं।
मोंटे हर्र्ड

-3

एक UILabel के चारों ओर गोल किनारों के साथ एक सीमा लगाने के लिए मैं निम्नलिखित कार्य करता हूं:

labelName.layer.borderWidth = 1;
labelName.layer.borderColor = [[UIColor grayColor] CGColor];
labelName.layer.cornerRadius = 10;

(QuartzCore / QuartzCore.h को शामिल करना न भूलें)


5
यह पूरे लेबल के चारों ओर एक बड़ी सीमा जोड़ता है, पाठ के आसपास नहीं
पावेल एलेक्सीव
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.