আমি কীভাবে ইউআইএলবেলকে রূপরেখার পাঠ্য প্রদর্শন করব?


108

আমি যা চাই তা হ'ল আমার সাদা ইউআইবিবেল পাঠ্যের চারপাশে এক পিক্সেল কালো সীমানা।

আমি নীচের কোডটি দিয়ে ইউআইএলবেলকে সাবস্ক্ল্যাসিংয়ের মতো পেয়েছি, যা আমি বেশ কয়েকটি স্পর্শকাতরভাবে সম্পর্কিত কয়েকটি অনলাইন উদাহরণ থেকে আঁতকে ওঠে ob এবং এটি কাজ করে তবে এটি খুব, খুব ধীর (সিমুলেটর ব্যতীত) এবং আমি পাঠ্যটি উল্লম্বভাবে কেন্দ্রের মধ্যে পেতে পারি না (তাই আমি সাময়িকভাবে শেষ লাইনে 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]);
}

আমার কেবল এক উত্তেজনাপূর্ণ অনুভূতি আছে যে আমি এটি করার জন্য একটি সহজ উপায়টিকে উপেক্ষা করছি। সম্ভবত "ড্রটেক্সটইনআরেক্ট" ওভাররাইড করে, তবে আমি ইচ্ছাকৃতভাবে এটিকে ঘোরানো এবং সত্যই শক্ত করে ফেলে দেওয়া সত্ত্বেও আমার ইচ্ছার দিকে বাঁকানোর জন্য ড্রটেক্সটইনআরেক্ট পেতে পারি না।


স্পষ্টকরণ - অল্পতা আমার অ্যাপ্লিকেশনটিতে দৃশ্যমান কারণ আমি যখন লেবেলের মানটি সামান্য বৃদ্ধি এবং সঙ্কুচিত হওয়ার সাথে পরিবর্তিত হয় তখন এটি অ্যানিমেট করি। সাবক্লাসিং ছাড়াই এটি মসৃণ, তবে উপরে লেবেল অ্যানিমেশন সহ কোডটি হ'ল উপায় py আমার কি কেবল একটি ইউআইবিউবভিউ ব্যবহার করা উচিত? লেবেলটি কেবল একটি একক সংখ্যা প্রদর্শন করছে বলে আমি নির্বোধ বোধ করছি ...
মন্টি হার্ড

ঠিক আছে দেখে মনে হচ্ছে যে আমার যে পারফরম্যান্স সমস্যাটি ছিল তা আউটলাইন কোডের সাথে সম্পর্কিত ছিল না, তবে আমি এখনও এটিকে উল্লম্বভাবে সারিবদ্ধ করার চেষ্টা করতে পারি না। 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
আমি এই কৌশলটি চেষ্টা করেছিলাম তবে ফলাফল সন্তুষ্টির চেয়ে কম নয়। আমার আইফোন 4 এ আমি একটি কালো রূপরেখা দিয়ে সাদা পাঠ্য আঁকার জন্য এই কোডটি ব্যবহার করার চেষ্টা করেছি। যা পেয়েছি তা হ'ল পাঠ্যের প্রতিটি বর্ণের বাম এবং ডান প্রান্তে কালো রূপরেখা ছিল তবে উপরে বা নীচে রূপরেখা নয়। কোন ধারনা?
মাইক হার্শবার্গ

দুঃখিত আমি আপনার কোডটি আমার প্রকল্পে ব্যবহার করার চেষ্টা করছি তবে কিছুই ঘটে না! এই ছবিটি দেখুন: লিঙ্ক
মমি

@ মোমেকস: আপনাকে সাবক্লাস করতে হবে UILabelএবং -drawTextInRect:বাস্তবায়নটি সেখানে রাখতে হবে।
জেফ কেলি

1
@ মোমেকস: যদি আপনি উদ্দেশ্য-সি-তে সাবক্লাস তৈরি করতে না জানেন তবে আপনার কিছুটা গুগলিং করা উচিত; আপেল এর উদ্দেশ্য উদ্দেশ্য সি জন্য একটি গাইড আছে।
জেফ কেলি

1
সম্ভবত - 2.5 বছর আগে আমি যখন এটি লিখেছিলাম তখন আমার অস্তিত্ব মনে হয় না :)
ক্রেপাবাস

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 নেতিবাচক হতে হবে , অর্থাত্ কেবলমাত্র অভ্যন্তরীণ রূপরেখা কাজ করে।

ইউটিআইটিেক্সটফিল্ডগুলি বিশিষ্ট পাঠ্যগুলি ব্যবহার করে একটি রূপরেখা সহ


17
উদ্দেশ্য-সি এর সুবিধার জন্য এটি হ'ল: লেবেল.অ্যাট্রিবিউটেডটেক্সট = [[এনএসএট্রিবিউটেড স্ট্রিং বরাদ্দ] আরবিস স্ট্রিং: @ "স্ট্রিং" বৈশিষ্ট্য: @ {এনএসএসট্রোকলকারঅ্যাট্রিবিউটনেম: [ইউআইকিওলোর ব্ল্যাক কালার], এনএসফোরগ্রাউন্ড কালারঅ্যাট্রিবিউটনাম: [ইউআইকিডোরস সাদা রঙ ;
লেসেক জাজারি

8
এই
মেমের

সুইফট 4.2: strokeTextAttributes দিন: [স্ট্রিং: যেকোনো] = [NSStrokeColorAttributeName: UIColor.black, NSForegroundColorAttributeName: UIColor.white, NSStrokeWidthAttributeName: -4,0,] consoleView.typingAttributes = strokeTextAttributes
Teo ধরণের লেখা

আপনাকে ধন্যবাদ টিওস্টোরি, আমি আমার উত্তরে সুইফট ৪.২ সিনট্যাক্স যুক্ত করেছি;)
অ্যাক্সেল গুইলিন

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

আপনি ইন্টারফেস বিল্ডারের একটি বিদ্যমান লেবেলে এই কাস্টম ইউআইএলবেল শ্রেণিটি যুক্ত করতে পারেন এবং এর মতো ব্যবহারকারীর সংজ্ঞায়িত রানটাইম বৈশিষ্ট্য যুক্ত করে সীমানার পুরুত্ব এবং এর বর্ণ পরিবর্তন করতে পারেন: ইন্টারফেস বিল্ডার সেটআপ

ফলাফল:

রূপরেখা সহ বড় লাল জি


1
খুশী হলাম। আমি এটি দিয়ে একটি আইবিআই স্পেসটেবল করব :)
মারিও কারভালহো

@ লাচেজার কীভাবে এটি কোনও ইউআইবাটন লেখার মাধ্যমে করা যায়?
ক্রেজিওন

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;

এটি আইওএস-র পুরানো সংস্করণগুলির সাথে সামঞ্জস্যপূর্ণ কিনা তা আমি জানি না ..

যাইহোক, আমি আশা করি এটি সাহায্য করে ...


9
এটি লেবেলের চারপাশে এক পিক্সেল সীমানা নয়। এটি নীচে সহজ ড্রপ ছায়া।
টিম

1
এটি ভুল সমাধান। ভাল godশ্বর কে এটি চিহ্নিত করেছে ?!
স্যাম বি

তারা বেশ স্পষ্টভাবে 'বাহ্যরেখা' বলেছিল, এটি একটি ছায়া। প্রশ্নের উত্তর দেয় না
হিটমে

5

ক্রেপবাসের উত্তর বন্ধের ভিত্তিতে একটি সুইফট 4 শ্রেণীর সংস্করণ

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

যেখানে মেইনকন্টেন্টভিউ এমন দৃশ্য যা আপনি এর স্ক্রিনশট নিতে চান। কোনও ইউআইআইমেজভিউতে ভিউ ইমেজ যুক্ত করুন এবং এটি অ্যানিমেট করুন।

আশা করি এটি আপনার অ্যানিমেশনের গতি বাড়িয়েছে !!

এন


এটি একটি দুর্দান্ত কৌশল যা আমি ব্যবহারের জন্য কয়েকটি জায়গার কথা ভাবতে পারি এবং সম্ভবত পারফরম্যান্সের সমস্যাটি সমাধান করি তবে আমি এখনও আশাবাদটি ধরে রেখেছি যে আমার কৃপণ সাবক্লাসের চেয়ে সহজ উপায় আছে ইউইলবেল পাঠ্যকে একটি রূপরেখা দেখানোর জন্য। মধ্য সময়ে আমি আপনার উদাহরণ দিয়ে খেলতে যাব ধন্যবাদ!
মন্টে হারড

আমি তোমার কষ্টটা অনুভব করতে পারছি. আমি নিশ্চিত না যে আপনি এটি করার জন্য একটি ভাল উপায় খুঁজে পাবেন। আমি প্রায়শই পণ্যের প্রভাবগুলিতে কোডের রিমগুলি লিখি তারপরে মসৃণ অ্যানিমেশনের জন্য তাদের (উপরের মতো) স্ন্যাপশট করি! উপরের উদাহরণের জন্য আপনার কোডে <কোয়ার্টজকোর / কোয়ার্টজকোর.এইচ> অন্তর্ভুক্ত করা দরকার! ভাগ্য সুপ্রসন্ন হোক! এন
নিক কার্টরাইট

4

পেশীবিশেষ হিসাবে উল্লেখ করেছেন, স্বীকৃত উত্তরের সীমানাটি কিছুটা দূরে কেন্দ্র। আমি স্ট্রোকের প্রস্থকে রঙ সাফ করার পরিবর্তে শূন্যে সেট করে এটি সংশোধন করতে সক্ষম হয়েছি।

অর্থাত্ প্রতিস্থাপন:

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 ঘন্টা স্ক্রিনে ঘুরে দেখছি এবং আমি এই মুহুর্তে খুব একটা পাই না ...
মন্টি হার্ড

আপনি ইতিমধ্যে পাঠ্য আঁকেন এমন একটি ক্লাস ইউআইএলবেলকে সাবক্লাসিং করছেন। এবং আপনি সাবক্লাসিংয়ের কারণ হ'ল আপনি পাঠ্যের চারপাশে একটি কালো সীমানা যুক্ত করতে চান। সুতরাং যদি আপনি সুপারক্লাসটি টেক্সট আঁকতে দেন, তবে আপনাকে যা করতে হবে তা হ'ল সীমানা আঁকুন, না?
কেন্ট

এটি একটি ভাল পয়েন্ট ... যদিও, তিনি যদি 1 পিক্সেল কালো সীমানা যুক্ত করতে চান, সাবক্লাস সম্ভবত অক্ষরগুলি খুব কাছাকাছি আঁকবে! .... আমি মূল প্রশ্নে পোস্ট করার মতো কিছু করব এবং অনুকূলিত করব (আমার পোস্টে বলা আছে)! এন
নিক কার্টরাইট

@ নিককার্টরাইট: যদি কেসটি ঘটে যে সুপারক্লাস আপনার কথা মতো কাজ করছে, আপনি [সুপার ড্রইরেক্ট] কল করার আগে সিজিআরেক্টটি ইনসেট করতে পারবেন could সুপারক্লাসের কার্যকারিতা পুনরায় লেখার চেয়ে এখনও সহজ এবং নিরাপদ।
কেন্ট

এবং তারপরে @ কেন্ট হতাশায় এসও ছেড়ে গেল। দুর্দান্ত উত্তর, +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আমার বর্তমান ইউলাইবেলে সাবউভিউ হিসাবে একটি কাস্টম শ্রেণীর একটি নতুন সংযুক্ত করেছি (এই উত্তরে অনুপ্রাণিত ) ।

এটি কেবল আপনার প্রকল্পে অনুলিপি করুন এবং আটকান এবং আপনি যেতে ভাল:

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

এটি আপনাকে কোনও বস্তুকে সাবক্লাসিং করে সংরক্ষণ করতে চলেছে এবং এটি করা মোটামুটি সহজ।

আপনি অ্যানিমেশন করতে চান কিনা তা উল্লেখ করার দরকার নেই, এটি ইউআইভিউ ক্লাসে তৈরি।


লেবেলের পাঠ্যটি পরিবর্তিত হয় এবং 1 পিক্সেল কালো আউটলাইন করতে আমার নিজের পাঠ্যটি প্রয়োজন। (ইউআইএলবেলের বাকী পটভূমি স্বচ্ছ))
মন্টি হার্ড

আমি ভেবেছিলাম আমি বুঝতে পেরেছিলাম যে এটি কীভাবে ইউআইএলবেলে আমার পাঠ্য কোনও পাঠ্যকে রূপরেখার কারণ হিসাবে তৈরি করবে, তবে আমি ইচ্ছাকৃতভাবে ক্লান্ত হয়ে পড়েছিলাম এবং এখন আমি কীভাবে এটি সম্পাদন করতে পারি তার চারপাশে আমার মন মোড়ানো বলে মনে হয় না। আমি initWithPatternI छवि পড়তে যাচ্ছি।
মন্টি হারড

-3

কোনও ইউআইএলবেলের চারদিকে গোলাকার প্রান্তযুক্ত একটি সীমানা রাখার জন্য আমি নিম্নলিখিতটি করছি:

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

(কোয়ার্টজকোর / কোয়ার্টজকোর এইচ অন্তর্ভুক্ত করতে ভুলবেন না)


5
এটি পাঠ্যের আশেপাশে নয়, পুরো লেবেলের চারপাশে একটি বড় সীমানা যুক্ত করেছে
পাভেল আলেক্সিভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.