UIButton এ আন্ডারলাইন করা পাঠ্য


143

যে কোনও ইউআইবাটনের শিরোনাম কীভাবে আন্ডারলাইন করা যায় তা পরামর্শ দিতে পারেন? আমার কাছে কাস্টম টাইপের একটি ইউআইবাটন আছে এবং আমি শিরোনামটি আন্ডারলাইন করা চাই, তবে ইন্টারফেস বিল্ডার এটি করার জন্য কোনও বিকল্প সরবরাহ করে না।

ইন্টারফেস বিল্ডারে আপনি যখন কোনও বোতামের জন্য ফন্ট অপশনটি নির্বাচন করেন, এটি কোনওটি, একক, ডাবল, রঙ নির্বাচন করার বিকল্প সরবরাহ করে তবে এগুলির কোনওটিই বোতামের শিরোনামে কোনও পরিবর্তন সরবরাহ করে না।

কোন সাহায্য প্রশংসা।


1
আপনি UITextView আরোপিত স্ট্রিং সঙ্গে এই প্রশ্নে যেমন একটি লিঙ্ক জুড়ে ব্যবহার করতে পারেন stackoverflow.com/questions/21629784/...
খালেদ Annajar

উত্তর:


79

UIUnderlinedButton.h

@interface UIUnderlinedButton : UIButton {

}


+ (UIUnderlinedButton*) underlinedButton;
@end

UIUnderlinedButton.m

@implementation UIUnderlinedButton

+ (UIUnderlinedButton*) underlinedButton {
    UIUnderlinedButton* button = [[UIUnderlinedButton alloc] init];
    return [button autorelease];
}

- (void) drawRect:(CGRect)rect {
    CGRect textRect = self.titleLabel.frame;

    // need to put the line at top of descenders (negative value)
    CGFloat descender = self.titleLabel.font.descender;

    CGContextRef contextRef = UIGraphicsGetCurrentContext();

    // set to same colour as text
    CGContextSetStrokeColorWithColor(contextRef, self.titleLabel.textColor.CGColor);

    CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + textRect.size.height + descender);

    CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + textRect.size.height + descender);

    CGContextClosePath(contextRef);

    CGContextDrawPath(contextRef, kCGPathStroke);
}


@end

1
আপনার প্রয়োজন মতো সময় মতো নাও হতে পারে!
নিক এইচ 247

4
ধন্যবাদ, আমি এটিকে নিম্নলিখিত হিসাবে কল করে শেষ করেছি: UIButton * বিটিএন = [ইউআইউন্ডারলাইনড বাটন বোতাম উইথটাইপ: UIButtonTypeCustom];
hb922

2
কোডটি ভালভাবে কাজ করে, তবে আমি লক্ষ্য করেছি যে ঘূর্ণনের দিকে drawRectডাকা হয়নি বলে কারণে ঘোরার উপর দৃষ্টিভঙ্গির আকার পরিবর্তন হয় তখন আন্ডারলাইনটি সঙ্কুচিত / বাড়েনি। আপনার বাটনটি পুনরায় চিত্রের মতো সেট করে সমাধান করা যেতে পারে: myButton.contentMode = UIViewContentModeRedraw;সীমা পরিবর্তন হলে বোতামটি পুনরায় আঁকতে বাধ্য করে।
অ্যান্ড্রয়েডনুব

4
আপনিও এর setTitleমতো পদ্ধতিটি ওভাররাইড করতে পারেন:objective-c - (void)setTitle:(NSString *)title forState:(UIControlState)state { [super setTitle:title forState:state]; [self setNeedsDisplay]; }
কিরুয়ালেক্স

378

নিম্নরেখাঙ্কিত করতে ইন্টারফেস বিল্ডারটি ব্যবহার করতে, একটিকে এগুলি করতে হবে:

  • এটি দায়ী হিসাবে পরিবর্তন করুন
  • বৈশিষ্ট্য পরিদর্শকের পাঠ্যটি হাইলাইট করুন
  • ডান ক্লিক করুন, ফন্ট এবং তারপরে আন্ডারলাইন নির্বাচন করুন

আইবি ব্যবহার করে আন্ডারলাইন করুন

ভিডিও অন্য কেউ করেছেন https://www.youtube.com/watch?v=5-ZnV3jQd9I


2
ভাল প্রশ্ন @ new2ios সম্ভবত অন্য কেউ জানেন
Finneycanhelp

1
আমি নতুন প্রশ্ন জিজ্ঞাসা করব, @ ফিনেচেনহেল্প। আমি আশা করি এক্সকোড 6.3 এ আরও সহজতর উপায় হবে। আমার অর্থ হ'ল আমি আপনার সমাধানটি সেট করতে পারি এবং তারপরে setTitleবিশিষ্ট পাঠ্য সহ ব্যবহার করতে পারি । আমার জন্য আন্ডারলাইন আঁকার জন্য কাস্টম বোতাম তৈরি করা কিছুটা বহিরাগত (সম্ভবত আমি আইওএসে নতুন এমনকি একটি অ্যাপ্লিকেশন সম্পন্ন হয়েও থাকতে পারি)।
new2ios

2
finneydonehelped! এর জন্য ধন্যবাদ! ফন্টের পপআপ ডায়ালগটির কোনও প্রভাব নেই কেন তা বুঝতে পারিনি। ডান ক্লিকটি নিখুঁত।
আইএমফ্লেচার 21

2
কোডটিতে কাজ করার সময় কিছুটা কাজ করা এই জাতীয় সাধারণ কাজের জন্য ইন্টারফেস বিল্ডার ব্যবহারকারীদের জন্য ভাল উত্তর Good ধন্যবাদ! (Y)
রেন্ডিকা বিশ্বমানের

1
আইওএস বিকাশকারীরা কেন খুব সাধারণ সমস্যার জন্য খুব দীর্ঘ কোড লিখতে পছন্দ করেন?
এমআর 5

129

আইওএস From থেকে এখন আরও অনেক নমনীয় উপায়ে আন্ডারলাইনিং (এবং অন্য কোনও বৈশিষ্ট্যযুক্ত স্ট্রিং সমর্থন সমর্থন করে) করতে এনএসএট্রিবিউটেড স্ট্রিং ব্যবহার করা সম্ভব:

NSMutableAttributedString *commentString = [[NSMutableAttributedString alloc] initWithString:@"The Quick Brown Fox"];

[commentString addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0, [commentString length])];

[button setAttributedTitle:commentString forState:UIControlStateNormal];

দ্রষ্টব্য: এটি অন্য উত্তর হিসাবে যুক্ত করেছে - এটি আমার আগেরটির সম্পূর্ণ ভিন্ন সমাধান হিসাবে।

সম্পাদনা করুন: অদ্ভুতভাবে (অন্তত আইওএস 8 এ) আপনাকে প্রথম চরিত্রটি আন্ডারলাইন করতে হবে অন্যথায় এটি কাজ করে না!

সুতরাং একটি workaround হিসাবে, প্রথম চর পরিষ্কার রঙের সাথে আন্ডারলাইন সেট করুন!

    // underline Terms and condidtions
    NSMutableAttributedString* tncString = [[NSMutableAttributedString alloc] initWithString:@"View Terms and Conditions"];

    // workaround for bug in UIButton - first char needs to be underlined for some reason!
    [tncString addAttribute:NSUnderlineStyleAttributeName
                      value:@(NSUnderlineStyleSingle)
                      range:(NSRange){0,1}];
    [tncString addAttribute:NSUnderlineColorAttributeName value:[UIColor clearColor] range:NSMakeRange(0, 1)];


    [tncString addAttribute:NSUnderlineStyleAttributeName
                      value:@(NSUnderlineStyleSingle)
                      range:(NSRange){5,[tncString length] - 5}];

    [tncBtn setAttributedTitle:tncString forState:UIControlStateNormal];

9
কেবল সচেতন হন যে আপনি যখন এটি এইভাবে করেন তখন আপনাকে অবশ্যই রঙের জন্য অ্যাট্রিবিউট যুক্ত করতে হবে, কারণ বিশিষ্ট শিরোনাম পাঠ্য সেটটাইটেল কালার ব্যবহার করে আপনি যে রঙটি সেট করেন তা ব্যবহার করবে না: স্টেট:
ডেভম্যাক

2
দারুণ, এবং আপনাকে ধন্যবাদ রঙিন রঙের জন্য @ ডেভম্যাক। যারা এই বৈশিষ্ট্যটি জানেন না তাদের জন্য: এনএসফোরগ্রাউন্ডকালারআর্ট্রিবিউটনাম
রায়ান ক্রু

এই পদ্ধতিগুলিতে বোতামের আন্ডারলাইনটি পাঠ্যের নিকটে কোনও পদ্ধতি আন্ডারলাইনটির y অবস্থান পরিবর্তন করতে পারে?
ইলেশ পি

49

আপনি নিজেই এটি ইন্টারফেস বিল্ডারে করতে পারেন।

  1. বৈশিষ্ট্য পরিদর্শক নির্বাচন করুন
  2. শিরোনামের ধরণটি সরল থেকে বিশিষ্টে পরিবর্তন করুন

এখানে চিত্র বর্ণনা লিখুন

  1. উপযুক্ত ফন্টের আকার এবং পাঠ্য প্রান্তিককরণ সেট করুন

এখানে চিত্র বর্ণনা লিখুন

  1. তারপরে শিরোনামের পাঠ্যটি নির্বাচন করুন এবং ফন্টটি নিম্নরেখাঙ্কিত হিসাবে সেট করুন

এখানে চিত্র বর্ণনা লিখুন


28

এটি বৈশিষ্ট্যযুক্ত স্ট্রিং সহ খুব সহজ

সেট বৈশিষ্ট্যযুক্ত একটি অভিধান তৈরি করে এবং বিশিষ্ট স্ট্রিংয়ের জন্য প্রয়োগ করুন। তারপরে আপনি uibutton এ atbbuttitle বা uilabel এ অ্যাট্রিবিউটটেক্সট হিসাবে বিশিষ্ট স্ট্রিং সেট করতে পারেন।

NSDictionary *attrDict = @{NSFontAttributeName : [UIFont
 systemFontOfSize:14.0],NSForegroundColorAttributeName : [UIColor
 whiteColor]};
 NSMutableAttributedString *title =[[NSMutableAttributedString alloc] initWithString:@"mybutton" attributes: attrDict]; 
[title addAttribute:NSUnderlineStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleSingle] range:NSMakeRange(0,[commentString length])]; [btnRegLater setAttributedTitle:title forState:UIControlStateNormal];

কি commentString; আপনি @ নিক এইচ 247 এর উত্তরটি থেকে অনুলিপি করেছেন?
অর্থ-বিষয়গুলি

21

এটি আমার ফাংশন, সুইফট ১.২ এ কাজ করে।

func underlineButton(button : UIButton, text: String) {

    var titleString : NSMutableAttributedString = NSMutableAttributedString(string: text)
    titleString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: NSMakeRange(0, count(text.utf8)))
    button.setAttributedTitle(titleString, forState: .Normal)
}

আপডেট সুইফট 3.0 এক্সটেনশন:

extension UIButton {
    func underlineButton(text: String) {
        let titleString = NSMutableAttributedString(string: text)
        titleString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSMakeRange(0, text.characters.count))
        self.setAttributedTitle(titleString, for: .normal)
    }
}

13

নিকের উত্তর এটি করার একটি দুর্দান্ত এবং দ্রুত উপায়।

আমি drawRectছায়ার জন্য সমর্থন যোগ ।

যদি আপনার বোতামের শিরোনামটির লেখার নীচে ছায়া থাকে তবে নিক এর উত্তর বিবেচনায় নেবে না:

এখানে চিত্র বর্ণনা লিখুন

তবে আপনি এর মতো ছায়ার উচ্চতা দ্বারা আন্ডারলাইনটি নীচে সরাতে পারেন:

CGFloat descender = self.titleLabel.font.descender;
CGContextRef contextRef = UIGraphicsGetCurrentContext();
CGFloat shadowHeight = self.titleLabel.shadowOffset.height;
descender += shadowHeight;

তারপরে আপনি এই জাতীয় কিছু পাবেন:

এখানে চিত্র বর্ণনা লিখুন


self.titleLabel.font.descender; এটি আইওএস 3.0
কিং

5

সুইফ্ট 3 এর জন্য নিম্নলিখিত এক্সটেনশনটি ব্যবহার করা যেতে পারে:

extension UIButton {
    func underlineButton(text: String) {
        let titleString = NSMutableAttributedString(string: text)
        titleString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.styleSingle.rawValue, range: NSMakeRange(0, text.characters.count))
        self.setAttributedTitle(titleString, for: .normal)
    }
}

4
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
CGRect textRect = self.titleLabel.frame;

// need to put the line at top of descenders (negative value)
CGFloat descender = self.titleLabel.font.descender;

CGContextRef contextRef = UIGraphicsGetCurrentContext();
UIColor *colr;
// set to same colour as text
if (self.isHighlighted || self.isSelected) {
    colr=self.titleLabel.highlightedTextColor;
}
else{
    colr= self.titleLabel.textColor;
}
CGContextSetStrokeColorWithColor(contextRef, colr.CGColor);

CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y +        textRect.size.height + descender);

CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + textRect.size.height + descender);

CGContextClosePath(contextRef);

CGContextDrawPath(contextRef, kCGPathStroke);
}
//Override this to change the underline color to highlighted color
-(void)setHighlighted:(BOOL)highlighted
{
[super setHighlighted:highlighted];
// [self setNeedsDisplay];
}

3

@ নিক এইচ 247 এর উত্তরের প্রসারিত করতে গিয়ে আমি এমন একটি সমস্যা অনুভব করেছি যেখানে প্রথমদিকে আন্ডারলাইনটি পুনরায় আঁকানো হয়নি যখন বোতামটি ঘোরানোর সময় পুনরায় আকার দেওয়া হয়েছিল; আপনার বোতামটি আবার পুনরায় আঁকতে সেট করে এটি সমাধান করা যেতে পারে:

myButton.contentMode = UIViewContentModeRedraw; 

যখন সীমা পরিবর্তন হয় তখন বোতামটি পুনরায় আঁকতে বাধ্য করে।

দ্বিতীয়ত, আসল কোডটি ধরে নেওয়া হয়েছিল যে আপনার বোতামটিতে কেবলমাত্র 1 লাইন পাঠ রয়েছে (আমার বোতামটি ঘোরানোর সময় 2 লাইনে আবৃত হয়) এবং আন্ডারলাইনটি কেবলমাত্র পাঠ্যের শেষ লাইনে প্রদর্শিত হবে। ড্রয়ারেক্ট কোডটি প্রথমে বোতামের লাইনগুলির সংখ্যা গণনা করার জন্য পরিবর্তন করা যেতে পারে, তারপরে প্রতিটি লাইনে একটি নীচের দিকে রাখুন, ঠিক তেমনভাবে:

 - (void) drawRect:(CGRect)rect {
CGRect textRect = self.titleLabel.frame;

// need to put the line at top of descenders (negative value)
CGFloat descender = self.titleLabel.font.descender;

CGContextRef contextRef = UIGraphicsGetCurrentContext();

// set to same colour as text
CGContextSetStrokeColorWithColor(contextRef, self.titleLabel.textColor.CGColor);

CGSize labelSize = [self.titleLabel.text sizeWithFont:self.titleLabel.font
                            constrainedToSize:self.titleLabel.frame.size
                                lineBreakMode:UILineBreakModeWordWrap];

CGSize labelSizeNoWrap = [self.titleLabel.text sizeWithFont:self.titleLabel.font forWidth:self.titleLabel.frame.size.width lineBreakMode:UILineBreakModeMiddleTruncation ];

int numberOfLines = abs(labelSize.height/labelSizeNoWrap.height);

for(int i = 1; i<=numberOfLines;i++) {
 //        Original code
 //        CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + textRect.size.height + descender + PADDING);
 //        
 //        CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + textRect.size.height + descender);

    CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + (labelSizeNoWrap.height*i) + descender + PADDING);

    CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + (labelSizeNoWrap.height*i) + descender);

    CGContextClosePath(contextRef);

    CGContextDrawPath(contextRef, kCGPathStroke);

}


}

আশা করি এই কোডটি অন্য কাউকে সাহায্য করবে!


3

দ্রুত

func underlineButton(button : UIButton) {

var titleString : NSMutableAttributedString = NSMutableAttributedString(string: button.titleLabel!.text!)
titleString.addAttribute(NSUnderlineStyleAttributeName, value: NSUnderlineStyle.StyleSingle.rawValue, range: NSMakeRange(0, button.titleLabel!.text!.utf16Count))
button.setAttributedTitle(titleString, forState: .Normal)}

3

আপনি এই কোডটি বোতামের ফাঁক দিয়ে আন্ডারলাইন যুক্ত করতে ব্যবহার করতে পারেন।

  • আমি যখন ইন্টারফেস বিল্ডারের কাছ থেকে একটি আন্ডারলাইন আঁকতে চেষ্টা করেছি। এটি নীচের চিত্র মত চেহারা।

1 - ইন্টারফেস বিল্ডার রেফারেন্স

এখানে চিত্র বর্ণনা লিখুন

  • এবং নীচের কোডটি ব্যবহারের পরে আমি ফলাফলটি যেমনটি চেয়েছিলাম তেমনটি অর্জন করেছি।

2 - বর্ণিত কোড ব্যবহার করে

এখানে চিত্র বর্ণনা লিখুন

public func setTextUnderline()
    {
        let dummyButton: UIButton = UIButton.init()
        dummyButton.setTitle(self.titleLabel?.text, for: .normal)
        dummyButton.titleLabel?.font = self.titleLabel?.font
        dummyButton.sizeToFit()

        let dummyHeight = dummyButton.frame.size.height + 3

        let bottomLine = CALayer()
        bottomLine.frame = CGRect.init(x: (self.frame.size.width - dummyButton.frame.size.width)/2, y: -(self.frame.size.height - dummyHeight), width: dummyButton.frame.size.width, height: 1.0)
        bottomLine.backgroundColor = self.titleLabel?.textColor.cgColor
        self.layer.addSublayer(bottomLine)
    }

এই কোড স্নিপেটের জন্য আপনাকে ধন্যবাদ, যা কিছু সীমিত, তাত্ক্ষণিক সহায়তা সরবরাহ করতে পারে। একটি সঠিক ব্যাখ্যা কেন এটি সমস্যার একটি ভাল সমাধান তা দেখিয়ে তার দীর্ঘমেয়াদী মানকে ব্যাপকভাবে উন্নত করবে এবং ভবিষ্যতে পাঠকদের আরও অন্যান্য অনুরূপ প্রশ্নের সাথে আরও দরকারী করে তুলবে। আপনার অনুমানগুলি সহ কিছু ব্যাখ্যা যুক্ত করতে দয়া করে আপনার উত্তরটি সম্পাদনা করুন।
টবি স্পিড

3

এক্সকোড 10.3 এ সেপ্টেম্বর 2019 পর্যন্ত কাজ করা সুইফ্ট 5.0 সংস্করণ:

extension UIButton {
  func underlineText() {
    guard let title = title(for: .normal) else { return }

    let titleString = NSMutableAttributedString(string: title)
    titleString.addAttribute(
      .underlineStyle,
      value: NSUnderlineStyle.single.rawValue,
      range: NSRange(location: 0, length: title.count)
    )
    setAttributedTitle(titleString, for: .normal)
  }
}

এটি ব্যবহার করতে, প্রথমে আপনার বোতামের শিরোনামটি সেট করুন button.setTitle("Button Title", for: .normal)এবং তারপরে button.underlineText()সেই শিরোনামটিকে আন্ডারলাইন করার জন্য কল করুন ।


1
আমি iOS 10.3.1 হিসাবে পুরানো সংস্করণগুলিতে এই কাজগুলি নিশ্চিত করতে পারি, এক্সকোড 10.3 মোজাভেতে পুরানো সিমুলেটরগুলিকে সমর্থন করে না, যতদূর আমি অবগত রয়েছি।
ম্যাক্স দেশিয়ভ

2

আমরা কীভাবে কেস পরিচালনা করব যখন আমরা একটি বোতাম চেপে ধরে রাখি? সেক্ষেত্রে বোতামের পাঠ্য বর্ণটি হাইলাইট করা রঙ অনুসারে পরিবর্তিত হয় তবে লাইনটি মূল রঙের অবশেষ। বলুন যে যদি স্বাভাবিক অবস্থায় বোতামের পাঠ্যের রঙ কালো হয় তবে এর আন্ডারলাইনেও কালো রঙ থাকবে। বোতামটির হাইলাইট করা রঙ সাদা। বোতাম টিপে রাখার ফলে পরিবর্তনগুলি বাটন পাঠ্যের রঙ কালো থেকে সাদা হয় তবে আন্ডারলাইন রঙ কালো থাকে।


2
আপনি যদি বোতামটি হাইলাইট করা হয় এবং বা নির্বাচিত হয় এবং তা অনুযায়ী রঙ সেট করে থাকেন তা পরীক্ষা করতে পারেন। পুনরায় আঁকার জন্য স্বয়ংক্রিয়ভাবে অনুরোধ করা হবে কিনা তা নিশ্চিত নন, আপনাকে যদি সেটসলেচারড / সেটহাইটলাইটের ওভাররাইড করতে হবে এবং সুপার এবং [সেলফ সেটনিডসডিসপ্লে] কল করতে হবে
নিক এইচ 247

2

আমি বিশ্বাস করি এটি এক্সকোডের ফন্ট সম্পাদকে কিছু বাগ আছে আপনি যদি ইন্টারফেস বিল্ডার ব্যবহার করে থাকেন তবে আপনাকে সমতল থেকে বৈশিষ্ট্যযুক্ত শিরোনাম পরিবর্তন করতে হবে, এক্সকোডের পাঠ্যবইরে আন্ডারলাইন করা পাঠ্য এবং অনুলিপি-পাঠ্য সম্পাদনা খুলুন


2

নিক এইচ 247 এর উত্তর কিন্তু সুইফ্ট পদ্ধতির:

import UIKit

class UnderlineUIButton: UIButton {

    override func drawRect(rect: CGRect) {
        super.drawRect(rect)

        let textRect = self.titleLabel!.frame

        var descender = self.titleLabel?.font.descender

        var contextRef: CGContextRef = UIGraphicsGetCurrentContext();

        CGContextSetStrokeColorWithColor(contextRef, self.titleLabel?.textColor.CGColor);

        CGContextMoveToPoint(contextRef, textRect.origin.x, textRect.origin.y + textRect.size.height + descender!);

        CGContextAddLineToPoint(contextRef, textRect.origin.x + textRect.size.width, textRect.origin.y + textRect.size.height + descender!);

        CGContextClosePath(contextRef);

        CGContextDrawPath(contextRef, kCGPathStroke);
    }
}

2
func underline(text: String, state: UIControlState = .normal, color:UIColor? = nil) {
        var titleString = NSMutableAttributedString(string: text)

        if let color = color {
            titleString = NSMutableAttributedString(string: text,
                               attributes: [NSForegroundColorAttributeName: color])
        }

        let stringRange = NSMakeRange(0, text.characters.count)
        titleString.addAttribute(NSUnderlineStyleAttributeName,
                                 value: NSUnderlineStyle.styleSingle.rawValue,
                                 range: stringRange)

        self.setAttributedTitle(titleString, for: state)
    }

1

কাস্টম আন্ডারলাইন রঙ, লাইনউইথ এবং ফাঁক দিয়ে @ নিক এইচ 247 এর উত্তরের জন্য সুইফ্ট 3 সংস্করণ :

import Foundation

class UnderlinedButton: UIButton {

    private let underlineColor: UIColor
    private let thickness: CGFloat
    private let gap: CGFloat

    init(underlineColor: UIColor, thickness: CGFloat, gap: CGFloat, frame: CGRect? = nil) {
        self.underlineColor = underlineColor
        self.thickness = thickness
        self.gap = gap
        super.init(frame: frame ?? .zero)
    }

    override func draw(_ rect: CGRect) {
        super.draw(rect)

        guard let textRect = titleLabel?.frame,
            let decender = titleLabel?.font.descender,
            let context = UIGraphicsGetCurrentContext() else { return }

        context.setStrokeColor(underlineColor.cgColor)
        context.move(to: CGPoint(x: textRect.origin.x, y: textRect.origin.y + textRect.height + decender + gap))
        context.setLineWidth(thickness)
        context.addLine(to: CGPoint(x: textRect.origin.x + textRect.width, y: textRect.origin.y + textRect.height + decender + gap))
        context.closePath()
        context.drawPath(using: .stroke)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.