কোনও ইউআইএলবেলে স্থান / প্যাডিং যুক্ত করা হচ্ছে


186

আমার একটি রয়েছে UILabelযেখানে আমি শীর্ষে এবং নীচে স্থান যুক্ত করতে চাই। সীমাবদ্ধতার ন্যূনতম উচ্চতার সাথে আমি এটিকে সংশোধন করেছি:

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

সম্পাদনা: এটি করার জন্য আমি ব্যবহার করেছি:

  override func drawTextInRect(rect: CGRect) {
        var insets: UIEdgeInsets = UIEdgeInsets(top: 0.0, left: 10.0, bottom: 0.0, right: 10.0)
        super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))

    } 

তবে আমি একটি আলাদা পদ্ধতি খুঁজে পেয়েছি কারণ আমি যদি দুটি লাইনের চেয়ে বেশি লিখি তবে সমস্যাটি একই রকম:

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



পরিশেষে আমরা কীভাবে এটি সঠিকভাবে করতে হবে তা অবশেষে নির্ণয় করলাম, সমস্ত গতিশীল ক্ষেত্রে, পুনরায় বিন্যাস বা অন্য কোনও সমস্যা ছাড়াই ইউআইএলবেলের কোনও নিখুঁত ড্রপ-ইন প্রতিস্থাপন হিসাবে। ইসস। stackoverflow.com/a/58876988/294884
ফ্যাটি

উত্তর:


121

আপনি যদি সাবস্ক্রাজিং না করেই ইউআইএলবেলের সাথে লেগে থাকতে চান তবে মুন্ডি আপনাকে একটি সুস্পষ্ট সমাধান দিয়েছেন।

বিকল্প হিসাবে যদি আপনি ইউআইআইভিউলে ইউআইএলবেল মোড়ানো এড়াতে ইচ্ছুক হন তবে আপনি ইউআইইডিজইনসেটস (প্যাডিং) বা সাবক্লাস ইউআইআইএলএবেল ইউআইইডিজইনসেটগুলি সমর্থন করতে সক্ষম করতে ইউআইটিএক্সটভিউটি ব্যবহার করতে পারেন।

একটি ব্যবহার UITextView শুধুমাত্র insets (obj-সি) প্রদান করতে হবে:

textView.textContainerInset = UIEdgeInsetsMake(10, 0, 10, 0);

বিকল্প, আপনি যদি ইউআইএলবেলকে সাবক্লাস করেন তবে এই পদ্ধতির একটি উদাহরণ ড্রটেক্সটইনক্র্যাক্ট পদ্ধতিটিকে
( ওবিজে -সি) ওভাররাইড করবে

- (void)drawTextInRect:(CGRect)uiLabelRect {
    UIEdgeInsets myLabelInsets = {10, 0, 10, 0};
    [super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, myLabelInsets)];
}

আপনি অতিরিক্ত, বাম, বটম এবং রাইটের জন্য ইনসেট ভেরিয়েবলগুলি সহ আপনার নতুন উপক্লসযুক্ত ইউিলাবেল সরবরাহ করতে পারেন।

একটি উদাহরণ কোড হতে পারে:

ইন। ঘন্টা (ওবিজে-সি)

float topInset, leftInset,bottomInset, rightInset;

ইন। মি (ওবিজে-সি)

- (void)drawTextInRect:(CGRect)uiLabelRect {
    [super drawTextInRect:UIEdgeInsetsInsetRect(uiLabelRect, UIEdgeInsetsMake(topInset,leftInset,bottomInset,rightInset))];
}

সম্পাদনা # 1:

আমি যা দেখেছি তা থেকে মনে হচ্ছে আপনি সাবস্ক্র্যাস করার সময় ইউআইএলবেলের অন্তর্নিহিত কন্টেন্টসাইজকে ওভাররাইড করতে হবে।

সুতরাং আপনার অন্তর্নিহিত কনটেন্টসাইজগুলি এইরূপে ওভাররাইড করা উচিত :

- (CGSize) intrinsicContentSize {
    CGSize intrinsicSuperViewContentSize = [super intrinsicContentSize] ;
    intrinsicSuperViewContentSize.height += topInset + bottomInset ;
    intrinsicSuperViewContentSize.width += leftInset + rightInset ;
    return intrinsicSuperViewContentSize ;
}

এবং আপনার পোকামাকড়গুলি স্বতন্ত্রভাবে সম্পাদনার পরিবর্তে সম্পাদনা করার জন্য নিম্নলিখিত পদ্ধতিটি যুক্ত করুন:

- (void) setContentEdgeInsets:(UIEdgeInsets)edgeInsets {
    topInset = edgeInsets.top;
    leftInset = edgeInsets.left;
    rightInset = edgeInsets.right; 
    bottomInset = edgeInsets.bottom;
    [self invalidateIntrinsicContentSize] ;
}

প্রান্তের ইনসেটগুলি মেলে এবং আপনার উল্লেখ করা মাল্টলাইন প্রয়োজনীয়তাটি coverাকতে এটি আপনার ইউআইবিবেলের আকার আপডেট করবে।

সম্পাদনা # 2

একটু অনুসন্ধানের পর আমি এই পাওয়া যায় সারকথা একটি IPInsetLabel সঙ্গে। যদি এই সমাধানগুলির মধ্যে কেউ কাজ না করে আপনি এটি ব্যবহার করে দেখতে পারেন।

সম্পাদনা # 3

এই বিষয়ে একটি অনুরূপ প্রশ্ন (নকল) ছিল।
উপলভ্য সমাধানগুলির সম্পূর্ণ তালিকার জন্য, এই উত্তরটি দেখুন: ইউআইএলবেল পাঠ্যের মার্জিন


দুঃখিত তবে আমি এর আগেও ব্যবহার করেছি: fun ওভাররাইড ফানক ড্রটেক্সটইনরেট (রেকট: সিজিআরেক্ট) {ভের ইনসেট: ইউআইএডজিআইনেসট = ইউআইইডিজিনেটস (শীর্ষ: 0.0, বাম: 10.0, নীচে: 0.0, ডান: 10.0) সুপার.ড্রেটেক্সট্রেক্টস ইনসেক্টস (ইউআইএডজেট ইনসেপ্ট ))} `এটা কাজ কারণ ফলাফলের একই, পরিবর্তনশীল কাজ না না ..
Annachiara

আপনি কি কোনও ইউআইএলবেলের পরিবর্তে কোনও ইউআইটিেক্সটভিউ দিয়ে চেষ্টা করেছেন? বা আপনার কি সত্যিই কোনও ইউআইএলবেল ব্যবহার করা দরকার?
নুনোফেন্ডেমস

@ আন্নাচিয়ারা আমার সম্পাদনাটি দেখুন check এটি কাজ করে কিনা দেখুন।
নুনোফেন্ডেমস

ঠিক আছে. এটি পাঠ্যদর্শনটি কাজ করেছিল? সুইফটে না লেখার জন্য দুঃখিত তবে আমি এখনও ওবজ-সি মোডে আছি। এই কোডটির সাথে আমার লক্ষ্যটি ছিল আপনাকে কোনও সিদ্ধান্তে পৌঁছাতে সহায়তা করা। আশা করি এটা হয়েছে।
14:54

1
টেক্সটভিউ এবং কিছু স্টোরিবোর্ড সেটিংস এবং সেলফ.টেক্সটভিউ.টেক্সটকন্টেইনারআইনেসেট = ইউআইইডিজইনসেটস মেক (0, 10, 10, 10) ব্যবহার করে; শেষ পর্যন্ত এটি কাজ করে! ধন্যবাদ!
আন্নাচিয়ারা

206

আমি এটি সুইফট ৪.২ এ চেষ্টা করেছি , আশা করি এটি আপনার পক্ষে কার্যকর হবে!

@IBDesignable class PaddingLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 5.0
    @IBInspectable var bottomInset: CGFloat = 5.0
    @IBInspectable var leftInset: CGFloat = 7.0
    @IBInspectable var rightInset: CGFloat = 7.0

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: rect.inset(by: insets))
    }

    override var intrinsicContentSize: CGSize {
        let size = super.intrinsicContentSize
        return CGSize(width: size.width + leftInset + rightInset,
                      height: size.height + topInset + bottomInset)
    }   

    override var bounds: CGRect {
        didSet {
            // ensures this works within stack views if multi-line
            preferredMaxLayoutWidth = bounds.width - (leftInset + rightInset)
        }
    } 
}

অথবা আপনি এখানে কোকোপড ব্যবহার করতে পারেন https://github.com/levantAJ/ প্যাডিংল্যাবেল

pod 'PaddingLabel', '1.2'

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


6
ইউইলবেল প্রস্থ পরিবর্তন হচ্ছে না, কারণ পাঠ্যটি "..." হয়ে উঠছে
নওবি

1
@ তাই লে, ভাগ করে নেওয়ার জন্য ধন্যবাদ, আমি এটি টেবিলভিউতে ব্যবহার করেছি, কেন জানি না এটির লেখাগুলি ছাঁটাই করা যায়, যেমন। শিক্ষার্থী পড়াশুনা করে,
বিশ্ব.দীপাক

1
@ টিম সম্ভবত আপনি ব্যবহার করতে চেয়েছিলেনmin
অর্থাত্

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

1
এগুলিকে এই পরিস্থিতিতে কাজ করতে, আপনাকে "সেটবাউন্ডস" ওভাররাইড করতে হবে এবং সেলফ.ফেসারড ম্যাক্স লেআউটউইথকে চৌম্বকের প্রস্থে সেট করতে হবে, আপনার বাম এবং ডান
ইনসেটগুলি

82

সুইফট 3

import UIKit

class PaddingLabel: UILabel {

   @IBInspectable var topInset: CGFloat = 5.0
   @IBInspectable var bottomInset: CGFloat = 5.0
   @IBInspectable var leftInset: CGFloat = 5.0
   @IBInspectable var rightInset: CGFloat = 5.0

   override func drawText(in rect: CGRect) {
      let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
      super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
   }

   override var intrinsicContentSize: CGSize {
      get {
         var contentSize = super.intrinsicContentSize
         contentSize.height += topInset + bottomInset
         contentSize.width += leftInset + rightInset
         return contentSize
      }
   }
}

কেবলমাত্র একটি সামান্য মন্তব্য: পরিচয় পরিদর্শককে (কাস্টম শ্রেণি) লেবেলে এই শ্রেণিটি সেট করুন এবং লেবেল প্যাডিং নামের অ্যাট্রিবিউট ইন্সপেক্টরটিতে নতুন বৈশিষ্ট্য ব্যবহার করুন। 5 টি প্যাডিংয়ের
নীচেও কার্যকর রয়েছে

3
এটি সর্বদা মাল্টলাইন লেবেলের সাথে সঠিকভাবে কাজ করে না, কারণ যখন লেবেলটি তার উচ্চতা গণনা করে, তখন এটি শূন্য প্যাডিং করে।
fhucho

76

আপনি আইবি থেকে এটি সঠিকভাবে করতে পারেন:

  1. পাঠ্যকে দায়ী হিসাবে পরিবর্তন করুন

গুণিত পাঠ্য

  1. "..." দিয়ে ড্রপডাউন তালিকায় যান

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

  1. আপনি লাইন, অনুচ্ছেদ এবং পাঠ্য পরিবর্তন ইন্ডেন্ট প্রথম লাইন বা আপনার ইচ্ছামত কিছু প্যাডিং বৈশিষ্ট্য দেখতে পাবেন

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

  1. ফলাফল পরীক্ষা করুন

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


1
আমার স্টোরিবোর্ডে আমি পাঠ্য পরিবর্তনটি দেখতে পাব কিন্তু যখন আমি অ্যাপটি চালাই। পাঠ্যটি পরিবর্তনটি দেখায় না ... টি টি .. আমার লেবেলটি একটি কাস্টম সেলের ভিতরে রয়েছে, কোনও সমস্যা আছে?
এ ট্রেজো

1
@ এ.ট্রেজো আপনার কাস্টম সেল হতে পারে রান চলাকালীন লেবেল সম্পত্তি সেট করে।
পিয়েরে-ইয়ভেস গিলিমেট

1
স্টোরিবোর্ডে পরিবর্তনগুলি উপস্থিত হতে পারে তবে আপনি যখন অ্যাপটি চালাবেন তখন কোনও পরিবর্তন হয় না।
রিঞ্জ

4
আপনি পাঠ্যক্রমিকভাবে পাঠ্য সেট করার সময় এটি প্রযোজ্য নয়।
নিজ

1
এটি উত্তর নয়। আপনার কেবল প্রথম লাইনের ইনডেন্টের উপর নিয়ন্ত্রণ রয়েছে, সমস্ত দিকের প্যাডিং নয়।
রোমেক্স

49

সুইফট 4

প্রকল্পে সমস্ত ইউআইএলবেল সন্তানের জন্য সহজ সমাধান ব্যবহারের সহজ।

উদাহরণ:

let label = UILabel()
    label.<Do something>
    label.padding = UIEdgeInsets(top: 0, left: 16, bottom: 0, right: 0)

ইউআইএলবেল এক্সটেনশন

import UIKit

extension UILabel {
    private struct AssociatedKeys {
        static var padding = UIEdgeInsets()
    }

    public var padding: UIEdgeInsets? {
        get {
            return objc_getAssociatedObject(self, &AssociatedKeys.padding) as? UIEdgeInsets
        }
        set {
            if let newValue = newValue {
                objc_setAssociatedObject(self, &AssociatedKeys.padding, newValue as UIEdgeInsets?, objc_AssociationPolicy.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
            }
        }
    }

    override open func draw(_ rect: CGRect) {
        if let insets = padding {
            self.drawText(in: rect.inset(by: insets))
        } else {
            self.drawText(in: rect)
        }
    }

    override open var intrinsicContentSize: CGSize {
        guard let text = self.text else { return super.intrinsicContentSize }

        var contentSize = super.intrinsicContentSize
        var textWidth: CGFloat = frame.size.width
        var insetsHeight: CGFloat = 0.0
        var insetsWidth: CGFloat = 0.0

        if let insets = padding {
            insetsWidth += insets.left + insets.right
            insetsHeight += insets.top + insets.bottom
            textWidth -= insetsWidth
        }

        let newSize = text.boundingRect(with: CGSize(width: textWidth, height: CGFloat.greatestFiniteMagnitude),
                                        options: NSStringDrawingOptions.usesLineFragmentOrigin,
                                        attributes: [NSAttributedString.Key.font: self.font], context: nil)

        contentSize.height = ceil(newSize.size.height) + insetsHeight
        contentSize.width = ceil(newSize.size.width) + insetsWidth

        return contentSize
    }
}

1
দয়া করে সংক্ষিপ্তভাবে আপনার উত্তরটি ব্যাখ্যা করুন, এবং কেবল পোস্ট কোড নয়।
lmiguelvargasf

4
আপনার এক্সটেনশানটি অফফাইনগুলিতে 0 মানটি বাতিল করে
এন্টোইন

এটি দুর্দান্ত, তবে আমার একাধিক লাইন নিয়ে সমস্যা রয়েছে এমনকি আমি ভেবেছিলাম যে আমি 2 টি লাইনের সংখ্যা যুক্ত করেছি বা 0 এ রেখেছি, এটি সর্বদা একটি দেখায়। আপনি কিভাবে এটি সমাধান করতে জানেন?
মাগো নিকোলাস পালাসিওস

1
@ অ্যান্টাইনবোডার্ট আপনি কীভাবে নম্বরটি অফলাইন সমস্যা সমাধান করতে পরিচালনা করেছেন?
মাগো নিকোলাস পালাসিওস

@ এন্টোইনবোদার্ট, @ ম্যাগো নিকোলাস প্যালাসিয়োস - সমাধান হয়েছে!
iEvgen পোডকোরিটোভ

47

কেবলমাত্র UIViewএকটি সুপারভিউ হিসাবে ব্যবহার করুন এবং অটো লেআউট সহ লেবেলে একটি নির্দিষ্ট মার্জিন সংজ্ঞায়িত করুন।


1
drawTextInRect শুধুমাত্র 1 লাইনের জন্য intrinsicContentSizeকাজ করে, অনুভূমিক প্যাডিংয়ের সাথে কাজ করে না। ইউআইভিউ-র ভিতরে ইউআইলাবেলকে জড়িয়ে রাখার ভাল উপায়
onwayway133

8
আপনি যদি আইবিতে থাকেন তবে এখন সময় মেনু সম্পাদক -> এম্বেড ইন -> দেখুন মনে রাখার সময়। প্রথমে আপনার ইউআইএলবেলটি প্রথম নির্বাচন করুন :)
গ্রাহাম

46

কেবলমাত্র একটি ইউআইবাটন ব্যবহার করুন, এটি ইতিমধ্যে অন্তর্নির্মিত all

let button = UIButton()
button.contentEdgeInsets = UIEdgeInsets(top: 5, left: 5, bottom: 5, right: 5)
button.setTitle("title", for: .normal)
button.tintColor = .white // this will be the textColor
button.isUserInteractionEnabled = false

2
আরে এই দুর্দান্ত টিপ! কোন এক্সটেনশন প্রয়োজন! :-D
ফিলিপ ফেরি

2
সেটিংসটি isUserInteractionEnabled = falseঅক্ষম করার পক্ষে সুবিধাজনক।
এমএক্সসিএল

দুর্দান্ত টিপ ... আমি এক্সটেনশনের চেয়ে বরং এটি করতাম।
রস

1
ইন্টারফেস বিল্ডারে এটিও করা যেতে পারে যে বড় সুবিধা সহ, সুন্দর টিপ
Ely


16

স্টোরিবোর্ড ছাড়াই:

class PaddingLabel: UILabel {

    var topInset: CGFloat
    var bottomInset: CGFloat
    var leftInset: CGFloat
    var rightInset: CGFloat

    required init(withInsets top: CGFloat, _ bottom: CGFloat,_ left: CGFloat,_ right: CGFloat) {
        self.topInset = top
        self.bottomInset = bottom
        self.leftInset = left
        self.rightInset = right
        super.init(frame: CGRect.zero)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override var intrinsicContentSize: CGSize {
        get {
            var contentSize = super.intrinsicContentSize
            contentSize.height += topInset + bottomInset
            contentSize.width += leftInset + rightInset
            return contentSize
        }
    }
}

ব্যবহার:

let label = PaddingLabel(8, 8, 16, 16)
label.font = .boldSystemFont(ofSize: 16)
label.text = "Hello World"
label.backgroundColor = .black
label.textColor = .white
label.textAlignment = .center
label.layer.cornerRadius = 8
label.clipsToBounds = true
label.sizeToFit()

view.addSubview(label)

ফলাফল:


কাজ করে, তবে কীভাবে আপনি এটি একাধিক লাইন গ্রহণ করবেন তা জানেন? "প্যাডিংলাবেল (ইনসেটস: 8, 8, 16, 16) দিয়ে শুধু থ্রিম পরিবর্তন করুন"
ক্যামিলো অর্টেগন

15

প্যাডিং a UILabel , সম্পূর্ণ দ্রবণ। 2020 এর জন্য আপডেট হয়েছে।

দেখা যাচ্ছে যে তিনটি জিনিস অবশ্যই করা উচিত।

১. নতুন ছোট আকারের সাথে পাঠ্যক্ষেত্রকে # ফরবেন্ড কল করতে হবে

২. নতুন নতুন আকারের সাথে অবশ্যই ড্রটেক্সটকে ওভাররাইড করতে হবে

৩. যদি গতিশীল আকারের কক্ষ হয় তবে অবশ্যই আন্তঃসংশ্লিষ্ট আকারটি সামঞ্জস্য করতে হবে

নীচের আদর্শ উদাহরণে, পাঠ্য ইউনিটটি একটি সারণী দর্শন, স্ট্যাক ভিউ বা অনুরূপ নির্মাণে রয়েছে, এটি এটিকে একটি নির্দিষ্ট প্রস্থ দেয় । উদাহরণস্বরূপ আমরা 60,20,20,24 এর প্যাডিং চাই।

সুতরাং, আমরা "বিদ্যমান" অন্তর্নিহিত কনসেন্টসাইজটি নিই এবং প্রকৃতপক্ষে উচ্চতায় 80 যোগ করি

পুনরাবৃত্তি করতে ...

আপনাকে ইঞ্জিন দ্বারা আক্ষরিকভাবে উচ্চতা গণনা করা "এখন অবধি" পেতে হবে এবং সেই মানটি পরিবর্তন করতে হবে।

আমি যে প্রক্রিয়া বিভ্রান্তিকর, কিন্তু, এটি যে এটি কাজ করে। আমার জন্য, অ্যাপলকে "প্রাথমিক উচ্চতার গণনা" এর মতো কিছু কল প্রকাশ করা উচিত।

দ্বিতীয়ত আমাদের আসলে নতুন নতুন আকারের সাথে পাঠ্যক্ষেত্রের # forbouts কলটি ব্যবহার করতে হবে ।

সুতরাং টেক্সটরেট # ফরবাউন্ডে আমরা প্রথমে আকার ছোট করি এবং তারপরে সুপারকে কল করি।

সতর্কতা! আপনি সুপার পরে কল করা উচিত , আগে না!

যদি আপনি এই পৃষ্ঠার সমস্ত প্রচেষ্টা এবং আলোচনাটি সাবধানতার সাথে তদন্ত করেন, তবে এটিই সঠিক সমস্যা। কিছু সমাধান লক্ষ্য করুন "প্রায় কাজ করা মনে হচ্ছে" তবে তারপরে কেউ রিপোর্ট করবেন যে নির্দিষ্ট পরিস্থিতিতে এটি কাজ করবে না। এটি প্রকৃতপক্ষে সঠিক কারণ - বিভ্রান্তিকরভাবে আপনাকে অবশ্যই "পরে সুপার বলা উচিত", আগে নয়।

সুতরাং, আপনি যদি সুপারটিকে "ভুল ক্রমে" বলে থাকেন তবে এটি সাধারণত কাজ করে তবে নির্দিষ্ট নির্দিষ্ট পাঠ্যের দৈর্ঘ্যের জন্য এটি কার্যকর হয় না

"ভুলভাবে প্রথমে সুপার করা" এর একটি চাক্ষুষ উদাহরণ এখানে রয়েছে:

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

60,20,20,24 মার্জিনটি সঠিক কিনা লক্ষ্য করুন তবে আকারের গণনাটি আসলে ভুল, কারণ এটি পাঠ্যক্ষেত্রের জন্য "সুপার ফার্স্ট" প্যাটার্ন দিয়ে সম্পন্ন হয়েছিল # ফরবাউন্ডস।

ফিক্সড:

লক্ষ্য করুন যে কেবলমাত্র পাঠ্য রেক্ট # ফরবাউন্ড ইঞ্জিনটি কীভাবে গণনাটি সঠিকভাবে করতে হয় তা জানে :

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

অবশেষে!

আবার, এই উদাহরণে ইউআইএলবেল সেই সাধারণ পরিস্থিতিতে ব্যবহার করা হচ্ছে যেখানে প্রস্থটি স্থির করা আছে। সুতরাং অন্তর্নিবিজ্ঞান আকারে আমাদের সামগ্রিক অতিরিক্ত উচ্চতা আমরা চাই "যুক্ত" করতে। (আপনার কোনও প্রস্থে "যুক্ত" করার দরকার নেই, এটি নির্ধারিত হওয়ার সাথে সাথে এটি অর্থহীন হবে))

তারপরে টেক্সটরেট # ফরবাউন্ডে আপনি অটোলেআউট দ্বারা "এখন পর্যন্ত প্রস্তাবিত" সীমাগুলি পেয়ে যান, আপনি আপনার মার্জিনগুলি বিয়োগ করেন , এবং কেবল তখনই আবার পাঠ্য রেক্ট # ফরবাউন্ড ইঞ্জিনে কল করুন, এটি সুপারিতে বলা হবে, যা আপনাকে ফলাফল দেবে।

অবশেষে এবং সরলভাবে অঙ্কনের ক্ষেত্রে অবশ্যই আপনি সেই একই ছোট বাক্সে আঁকুন।

রাম রাম!

let UIEI = UIEdgeInsets(top: 60, left: 20, bottom: 20, right: 24) // as desired

override var intrinsicContentSize:CGSize {
    numberOfLines = 0       // don't forget!
    var s = super.intrinsicContentSize
    s.height = s.height + UIEI.top + UIEI.bottom
    s.width = s.width + UIEI.left + UIEI.right
    return s
}

override func drawText(in rect:CGRect) {
    let r = rect.inset(by: UIEI)
    super.drawText(in: r)
}

override func textRect(forBounds bounds:CGRect,
                           limitedToNumberOfLines n:Int) -> CGRect {
    let b = bounds
    let tr = b.inset(by: UIEI)
    let ctr = super.textRect(forBounds: tr, limitedToNumberOfLines: 0)
    // that line of code MUST be LAST in this function, NOT first
    return ctr
}

আরেকবার. মনে রাখবেন যে এই এবং অন্যান্য QA এর উত্তর যা "প্রায়" সঠিক, উপরের প্রথম চিত্রটিতে সমস্যাটি ভোগ করে - "সুপারটি ভুল জায়গায় রয়েছে" । আপনাকে অবশ্যই আকারটিকে আন্তঃসংশ্লিষ্ট আকারে আরও বড় করতে হবে এবং তারপরে টেক্সটরেটে # ফরবাউন্ডে আপনাকে অবশ্যই প্রথম প্রস্তাবের সীমানা সঙ্কুচিত করতে হবে এবং তারপরে সুপার কল।

সংক্ষিপ্তসার: আপনার অবশ্যই "সুপারকে শেষ কল করুন পাঠ্যক্ষেত্রের জন্য # বাউন্ডগুলিতে "

এটাই রহস্য।

নোট করুন যে আপনার অতিরিক্ত অকার্যকর, সাইজথ্যাটফিটস, প্রয়োজনলয়আউট বা অন্য কোনও জোর করে কল করার প্রয়োজন নেই এবং প্রয়োজনও নেই। একটি সাধারণ সমাধান স্বাভাবিক অটোলেআউট অঙ্কন চক্রটিতে সঠিকভাবে কাজ করা উচিত।


টিপ:

আপনি যদি মনোস্পেস ফন্টগুলির সাথে কাজ করছেন তবে এখানে একটি দুর্দান্ত টিপ: https://stackoverflow.com/a/59813420/294884


11

সুইফট 4+

class EdgeInsetLabel: UILabel {
    var textInsets = UIEdgeInsets.zero {
        didSet { invalidateIntrinsicContentSize() }
    }

    override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
        let textRect = super.textRect(forBounds: bounds, limitedToNumberOfLines: numberOfLines)
        let invertedInsets = UIEdgeInsets(top: -textInsets.top,
                                          left: -textInsets.left,
                                          bottom: -textInsets.bottom,
                                          right: -textInsets.right)
        return textRect.inset(by: invertedInsets)
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: textInsets))
    } 
}

ব্যবহার:

let label = EdgeInsetLabel()
label.textInsets = UIEdgeInsets(top: 2, left: 6, bottom: 2, right: 6)

অপেক্ষা করুন - কিছু ক্ষেত্রে আমি এটির সাথে আসলে একটি সমস্যা পেয়েছি। আগে এটি সবচেয়ে সঠিক উত্তর ছিল। আমি নীচে সঠিক উত্তর রেখেছি।
ফ্যাটি

আমি আমার উত্তরে সমস্যাটি দেখিয়ে একটি চিত্র অন্তর্ভুক্ত করেছি
ফ্যাটি

9

বাস্তবায়নের উদাহরণ সহ সুইফট 3 কোড

class UIMarginLabel: UILabel {

    var topInset:       CGFloat = 0
    var rightInset:     CGFloat = 0
    var bottomInset:    CGFloat = 0
    var leftInset:      CGFloat = 0

    override func drawText(in rect: CGRect) {
        let insets: UIEdgeInsets = UIEdgeInsets(top: self.topInset, left: self.leftInset, bottom: self.bottomInset, right: self.rightInset)
        self.setNeedsLayout()
        return super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }
}

class LabelVC: UIViewController {

    //Outlets
    @IBOutlet weak var labelWithMargin: UIMarginLabel!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Label settings.
        labelWithMargin.leftInset = 10
        view.layoutIfNeeded()
    }
}

স্টোরিবোর্ড লেবেল অবজেক্টে ক্লাসের নাম UIMarginLabel যুক্ত করতে ভুলবেন না। শুভ কোডিং!


8

অনুযায়ী সুইফট 4.2 (Xcode 10 বিটা 6) "UIEdgeInsetsInsetRect" অবচিত করা হচ্ছে। ক্লাসটিকে আরও কার্যকর করার জন্য আমি জনসাধারণকেও ঘোষণা করেছি।

public class UIPaddedLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 5.0
    @IBInspectable var bottomInset: CGFloat = 5.0
    @IBInspectable var leftInset: CGFloat = 7.0
    @IBInspectable var rightInset: CGFloat = 7.0

    public override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: rect.inset(by: insets))
    }

    public override var intrinsicContentSize: CGSize {
        let size = super.intrinsicContentSize
        return CGSize(width: size.width + leftInset + rightInset,
                      height: size.height + topInset + bottomInset)
    }

    public override func sizeToFit() {
        super.sizeThatFits(intrinsicContentSize)
    }
}

এটা ভাল কাজ করে. তবে আমি এটি একটি কালেকশনভিউসিলের অভ্যন্তরে ব্যবহার করার চেষ্টা করি এবং এটি পুনরায় ব্যবহারের পরে আকারটি ভাল আকার দেয় না (আকারটিফিট এবং লেআউটআইফেনিডের পরে ইভেন্ট)। কোনও আইডি কীভাবে এটির আকার পরিবর্তন করবেন?
বগি

1
আমি আপডেট sizeToFit () এটা পুনর্ব্যবহারযোগ্য দৃশ্য সঙ্গে কাজ করতে করেনি
Bogy

sizeToFit()এই হিসাবে সর্বজনীন হওয়া উচিত: "ওভাররাইডিং উদাহরণ পদ্ধতিটি অবশ্যই তার
ঘেরের

7

আমি স্বীকৃত উত্তরে কিছুটা সম্পাদনা করেছি। সমস্যা leftInsetএবং সমস্যা রয়েছে যখন rightInsetপাঠ্যের একটি অংশ অদৃশ্য হয়ে যাবে, খ / সি লেবেলের প্রস্থ সংকীর্ণ হবে তবে উচ্চতা চিত্র হিসাবেও বৃদ্ধি পাবে না:

ভুল অভ্যন্তরীণ সামগ্রীর আকার সহ লেডিং প্যাডিং

এই সমস্যাটি সমাধান করার জন্য আপনাকে নীচের হিসাবে পাঠ্যের উচ্চতা পুনরায় গণনা করতে হবে:

@IBDesignable class PaddingLabel: UILabel {

  @IBInspectable var topInset: CGFloat = 20.0
  @IBInspectable var bottomInset: CGFloat = 20.0
  @IBInspectable var leftInset: CGFloat = 20.0
  @IBInspectable var rightInset: CGFloat = 20.0

  override func drawTextInRect(rect: CGRect) {
    let insets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
    super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))
  }

  override func intrinsicContentSize() -> CGSize {
    var intrinsicSuperViewContentSize = super.intrinsicContentSize()

    let textWidth = frame.size.width - (self.leftInset + self.rightInset)
    let newSize = self.text!.boundingRectWithSize(CGSizeMake(textWidth, CGFloat.max), options: NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: self.font], context: nil)
    intrinsicSuperViewContentSize.height = ceil(newSize.size.height) + self.topInset + self.bottomInset

    return intrinsicSuperViewContentSize
  }
}

এবং ফলাফল:

ডান অভ্যন্তরীণ সামগ্রীর আকার সহ লেডিং প্যাডিং

আমি আশা করি আমার মতো একই পরিস্থিতিতে কিছু লোককে সহায়তা করব।


2
আপনি যদি সুইফট ৩.০ ব্যবহার করার পরিকল্পনা করেন তবে আপনাকে অবশ্যই ফাংশনের নাম পরিবর্তন করতে হবে, কারণ নতুন অ্যাপল ভাষা সম্পূর্ণ ফান সংজ্ঞাটি পুরোপুরি ভঙ্গ করে। সুতরাং, override func drawTextInRect(rect: CGRect)হয়ে override func drawText(in rect: CGRect)এবং override func intrinsicContentSize() -> CGSizeহয়ে override var intrinsicContentSize : CGSize উপভোগ করুন!
ডেকে

দুর্ভাগ্যক্রমে আমি এটি কাজ করিনি। আমি আমাদের কোড সুইফট 5 দিয়ে চেষ্টা করেছি override var intrinsicContentSize: CGSize { // .. return intrinsicSuperViewContentSize }
নাজমুল হাসান

7

সাবক্লাসিং ছাড়াই অন্য বিকল্পটি হ'ল:

  1. লেবেল সেট করুন text
  2. sizeToFit()
  3. তারপরে প্যাডিং অনুকরণ করতে লেবেলের উচ্চতাটি কিছুটা বাড়ান

    label.text = "someText"
    label.textAlignment = .center    
    label.sizeToFit()  
    label.frame = CGRect( x: label.frame.x, y: label.frame.y,width:  label.frame.width + 20,height: label.frame.height + 8)

আশ্চর্যজনকভাবে, এটি আমার কেবলমাত্র দরকার ছিল, কেবল label.frame = CGRect( x: label.frame.origin.x - 10, y: label.frame.origin.y - 4, width: label.frame.width + 20,height: label.frame.height + 8)
এটির

6

সুইফট 3, আইওএস 10 সমাধান:

open class UIInsetLabel: UILabel {

    open var insets : UIEdgeInsets = UIEdgeInsets() {
        didSet {
            super.invalidateIntrinsicContentSize()
        }
    }

    open override var intrinsicContentSize: CGSize {
        var size = super.intrinsicContentSize
        size.width += insets.left + insets.right
        size.height += insets.top + insets.bottom
        return size
    }

    override open func drawText(in rect: CGRect) {
        return super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }
}

6

কেবল অটোলেআউট ব্যবহার করুন:

let paddedWidth = myLabel.intrinsicContentSize.width + 2 * padding
myLabel.widthAnchor.constraint(equalToConstant: paddedWidth).isActive = true

সম্পন্ন.


আপনি উচ্চতা সঙ্গে একই করতে পারেন।
শেডটিড

6

সুইফ্ট 3 এ

সেরা এবং সহজ উপায়

class UILabelPadded: UILabel {
     override func drawText(in rect: CGRect) {
     let insets = UIEdgeInsets.init(top: 0, left: 5, bottom: 0, right: 5)
     super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

}

4

সাবক্লাস ইউআইএলবেল। (ফাইল-নতুন-ফাইল- কোকো টাউচক্লাস-তৈরি ইউআইএলবেলের সাবক্লাস)।

//  sampleLabel.swift

import UIKit

class sampleLabel: UILabel {

 let topInset = CGFloat(5.0), bottomInset = CGFloat(5.0), leftInset = CGFloat(8.0), rightInset = CGFloat(8.0)

 override func drawTextInRect(rect: CGRect) {

  let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
  super.drawTextInRect(UIEdgeInsetsInsetRect(rect, insets))

 }
 override func intrinsicContentSize() -> CGSize {
  var intrinsicSuperViewContentSize = super.intrinsicContentSize()
  intrinsicSuperViewContentSize.height += topInset + bottomInset
  intrinsicSuperViewContentSize.width += leftInset + rightInset
  return intrinsicSuperViewContentSize
 }
}

ভিউকন্ট্রোলারটিতে:

override func viewDidLoad() {
  super.viewDidLoad()

  let labelName = sampleLabel(frame: CGRectMake(0, 100, 300, 25))
  labelName.text = "Sample Label"
  labelName.backgroundColor =  UIColor.grayColor()

  labelName.textColor = UIColor.redColor()
  labelName.shadowColor = UIColor.blackColor()
  labelName.font = UIFont(name: "HelveticaNeue", size: CGFloat(22))
  self.view.addSubview(labelName)
 }

বা স্টোরিবোর্ডে লেবেলের ক্লাস হিসাবে কাস্টম ইউআইবাবেল ক্লাস সংযুক্ত করুন।


যদি আপনি এই হার্ডকডযুক্ত মানগুলি শ্রেণীর বৈশিষ্ট্যগুলিতে পরিবর্তন করেন তবে আমি ভোট দিয়ে যাব, আমি ইতিমধ্যে এই কোডটি ব্যবহার করছি।
জুয়ান বোয়েরো

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

এটি সঠিক, তবে কমপক্ষে সুইফট 3-এর মতো, অন্তর্নিহিত কনটেন্টসাইজ কোনও ফাংশন নয় বরং একটি সম্পত্তি, সুতরাং "ওভাররাইড ভেরি ইন্টার্নসিক কনটেন্টসাইজ: সিজিফ্লোট {}" এর পরিবর্তে "ওভাররাইড ফানক ইনটিনিসকন্টিজাইজ" হওয়া উচিত, কেবল একটি নোট।
জয়ে

4

অন্যান্য উত্তরগুলির মতো তবে একটি বাগ ঠিক করুন। যখন label.widthস্বয়ংক্রিয় বিন্যাস দ্বারা নিয়ন্ত্রিত হয়, কখনও কখনও পাঠ্য ক্রপ করা হবে।

@IBDesignable
class InsetLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 4.0
    @IBInspectable var leftInset: CGFloat = 4.0
    @IBInspectable var bottomInset: CGFloat = 4.0
    @IBInspectable var rightInset: CGFloat = 4.0

    var insets: UIEdgeInsets {
        get {
            return UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        }
        set {
            topInset = newValue.top
            leftInset = newValue.left
            bottomInset = newValue.bottom
            rightInset = newValue.right
        }
    }

    override func sizeThatFits(_ size: CGSize) -> CGSize {
        var adjSize = super.sizeThatFits(size)
        adjSize.width += leftInset + rightInset
        adjSize.height += topInset + bottomInset
        return adjSize
    }

    override var intrinsicContentSize: CGSize {
        let systemContentSize = super.intrinsicContentSize
        let adjustSize = CGSize(width: systemContentSize.width + leftInset + rightInset, height: systemContentSize.height + topInset +  bottomInset) 
        if adjustSize.width > preferredMaxLayoutWidth && preferredMaxLayoutWidth != 0 {
            let constraintSize = CGSize(width: bounds.width - (leftInset + rightInset), height: .greatestFiniteMagnitude)
            let newSize = super.sizeThatFits(constraintSize)
            return CGSize(width: systemContentSize.width, height: ceil(newSize.height) + topInset + bottomInset)
        } else {
            return adjustSize
        }
    }

    override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: insets))
    }
}

2

সহজ প্যাডিং (সুইফট 3.0, অ্যালভিন জর্জ উত্তর):

  class NewLabel: UILabel {

        override func textRect(forBounds bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {
                return self.bounds.insetBy(dx: CGFloat(15.0), dy: CGFloat(15.0))
        }

        override func draw(_ rect: CGRect) {
                super.drawText(in: self.bounds.insetBy(dx: CGFloat(5.0), dy: CGFloat(5.0)))
        }

  }

2

মুন্ডির উত্তরের একটি বিশদ বিবরণ।

যেমন একটিতে একটি লেবেল এম্বেড করা UIViewএবং অটো লেআউটটির মাধ্যমে প্যাডিং প্রয়োগ করা। উদাহরণ:

প্যাডযুক্ত ইউিলাবেলের মতো দেখাচ্ছে looks

সংক্ষিপ্ত বিবরণ:

1) তৈরি a UIView ("প্যানেল" এবং এর উপস্থিতি সেট করুন।

2) একটি তৈরি করুন UILabel এবং এটি প্যানেলে যুক্ত করুন।

3) প্যাডিং প্রয়োগের ক্ষেত্রে সীমাবদ্ধতা যুক্ত করুন।

4) আপনার দর্শন শ্রেণিবিন্যাসে প্যানেল যুক্ত করুন, তারপরে প্যানেলটি অবস্থান করুন।

বিবরণ:

1) প্যানেল ভিউ তৈরি করুন।

let panel = UIView()
panel.backgroundColor = .green
panel.layer.cornerRadius = 12

2) লেবেলটি তৈরি করুন, প্যানেলটিতে একটি সংক্ষিপ্তসার হিসাবে যুক্ত করুন।

let label = UILabel()
panel.addSubview(label)

3) লেবেল এবং প্যানেলের প্রান্তগুলির মধ্যে সীমাবদ্ধতা যুক্ত করুন। এটি প্যানেলটিকে লেবেল থেকে একটি দূরত্ব রাখতে বাধ্য করে। অর্থাত্ "প্যাডিং"

সম্পাদকীয়: এগুলি হাতে হাতে করা অত্যন্ত ক্লান্তিকর, ভার্বোস এবং ত্রুটি-প্রবণ। আমি আপনাকে গিথুব থেকে একটি অটো লেআউট র‌্যাপার বাছাই বা নিজেই একটি লেখার পরামর্শ দিচ্ছি

label.panel.translatesAutoresizingMaskIntoConstraints = false
label.topAnchor.constraint(equalTo: panel.topAnchor,
    constant: vPadding).isActive = true
label.bottomAnchor.constraint(equalTo: panel.bottomAnchor,
    constant: -vPadding).isActive = true
label.leadingAnchor.constraint(equalTo: panel.leadingAnchor,
    constant: hPadding).isActive = true
label.trailingAnchor.constraint(equalTo: panel.trailingAnchor,
    constant: -hPadding).isActive = true

label.textAlignment = .center

4) আপনার দর্শন শ্রেণিবিন্যাসে প্যানেল যুক্ত করুন এবং তারপরে অবস্থানের সীমাবদ্ধতা যুক্ত করুন। উদাহরণস্বরূপ চিত্রের মতো টেবিলভিউসেল এর ডানদিকে আলিঙ্গন করুন।

দ্রষ্টব্য: আপনার কেবলমাত্র অবস্থানগত বাধা যুক্ত করতে হবে, মাত্রিক সীমাবদ্ধতাগুলি নয়: অটো লেআউট intrinsicContentSizeলেবেলের উভয় এবং পূর্বে যুক্ত হওয়া সীমাবদ্ধতার উপর ভিত্তি করে বিন্যাসটি সমাধান করবে ।

hostView.addSubview(panel)
panel.translatesAutoresizingMaskIntoConstraints = false
panel.trailingAnchor.constraint(equalTo: hostView.trailingAnchor,
    constant: -16).isActive = true
panel.centerYAnchor.constraint(equalTo: hostView.centerYAnchor).isActive = true

2

প্যাডিং প্রয়োগের সময় আপনি যদি পাঠ্য ট্রিমিংয়ের সমস্যার মুখোমুখি হন তবে এই কোডটি ব্যবহার করুন।

@IBDesignable class PaddingLabel: UILabel {

    @IBInspectable var topInset: CGFloat = 5.0
    @IBInspectable var bottomInset: CGFloat = 5.0
    @IBInspectable var leftInset: CGFloat = 5.0
    @IBInspectable var rightInset: CGFloat = 5.0

    override func drawText(in rect: CGRect) {
        let insets = UIEdgeInsets.init(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override var intrinsicContentSize: CGSize {
        var intrinsicSuperViewContentSize = super.intrinsicContentSize
        let textWidth = frame.size.width - (self.leftInset + self.rightInset)
        let newSize = self.text!.boundingRect(with: CGSize(textWidth, CGFloat.greatestFiniteMagnitude), options: NSStringDrawingOptions.usesLineFragmentOrigin, attributes: [NSFontAttributeName: self.font], context: nil)
        intrinsicSuperViewContentSize.height = ceil(newSize.size.height) + self.topInset + self.bottomInset
        return intrinsicSuperViewContentSize
    }
}

extension CGSize{
    init(_ width:CGFloat,_ height:CGFloat) {
        self.init(width:width,height:height)
    }
}

পোস্ট করার জন্য আপনাকে ধন্যবাদ, আমি প্যাডিং + ট্রিমিং সম্পর্কিত একটি সমাধান খুঁজছি। আপনার সমাধানটি আমার কাছে লেবেল.নম্বার অফলাইন = 0 যা প্রয়োজন তা ভঙ্গ করে বলে মনে হচ্ছে। কোন কাজ?
ডোন

1

অন্যান্য উত্তরের মতো, তবে দিন দিন প্যাডিং সেটআপ করার জন্য একটি মজাদার শ্রেণীর সাথে:

class UILabelExtendedView: UILabel
{
    var topInset: CGFloat = 4.0
    var bottomInset: CGFloat = 4.0
    var leftInset: CGFloat = 8.0
    var rightInset: CGFloat = 8.0

    override func drawText(in rect: CGRect)
    {
        let insets: UIEdgeInsets = UIEdgeInsets(top: topInset, left: leftInset, bottom: bottomInset, right: rightInset)
        super.drawText(in: UIEdgeInsetsInsetRect(rect, insets))
    }

    override public var intrinsicContentSize: CGSize
    {
        var contentSize = super.intrinsicContentSize
        contentSize.height += topInset + bottomInset
        contentSize.width += leftInset + rightInset
        return contentSize
    }

    func setPadding(top: CGFloat, left: CGFloat, bottom: CGFloat, right: CGFloat){
        self.topInset = top
        self.bottomInset = bottom
        self.leftInset = left
        self.rightInset = right
        let insets: UIEdgeInsets = UIEdgeInsets(top: top, left: left, bottom: bottom, right: right)
        super.drawText(in: UIEdgeInsetsInsetRect(self.frame, insets))
    }
}

1

একটি ব্যবহারিক সমাধান হ'ল প্রধান লেবেলের মতো একই উচ্চতা এবং রঙের ফাঁকা লেবেল যুক্ত করা। প্রধান লেবেলে শূণ্যে শীর্ষস্থানীয় / চলমান স্থান নির্ধারণ করুন, উল্লম্ব কেন্দ্রগুলি সারিবদ্ধ করুন এবং প্রস্থটিকে আপনার পছন্দসই প্রান্তিক করুন।


1

আপনি যদি পাঠ্য রেক্টরের চারপাশে 2px প্যাডিং যুক্ত করতে চান তবে কেবল এটি করুন:

let insets = UIEdgeInsets(top: -2, left: -2, bottom: -2, right: -2)
label.frame = UIEdgeInsetsInsetRect(textRect, insets)

টেক্সট্রেক্ট কী? label.frame?
গুস্তাভো বায়োচি কোস্টা

1

আপনি যদি স্টোরিবোর্ডে একটি @ আইবিআই স্পেসটেবল / @ আইবিডিজাইনেবল ইউআইএলবেল ব্যবহার করতে চান না বা প্রয়োজন (আমার মনে হয় এগুলি যেভাবেই খুব ধীর করে দেওয়া হয়েছে), তবে 4 টি পৃথক সিজিফ্লায়েটের পরিবর্তে ইউআইইডজেইনেসেটগুলি ব্যবহার করা ক্লিনার।

সুইফট ৪.২ এর জন্য কোড উদাহরণ:

class UIPaddedLabel: UILabel {
    var padding = UIEdgeInsets(top: 0, left: 0, bottom: 0, right: 0)

    public override func drawText(in rect: CGRect) {
        super.drawText(in: rect.inset(by: padding))
    }

    public override var intrinsicContentSize: CGSize {
        let size = super.intrinsicContentSize
        return CGSize(width: size.width + padding.left + padding.right,
                      height: size.height + padding.top + padding.bottom)
    }
}

1

উদ্দেশ্য গ

সেখানে তাই লে উত্তরের উপর ভিত্তি করে যা আইবি ডিজাইনেবলের মধ্যে বৈশিষ্ট্যটি কার্যকর করে, এখানে উদ্দেশ্য-সি সংস্করণ রয়েছে।

এটি আপনার লেবেল। এ রাখুন

@interface YourLabel : UILabel

@property IBInspectable CGFloat topInset;
@property IBInspectable CGFloat bottomInset;
@property IBInspectable CGFloat leftInset;
@property IBInspectable CGFloat rightInset;

@end

এবং এটি আপনার লেবেল.এম এ যাবে

IB_DESIGNABLE

@implementation YourLabel

#pragma mark - Super

- (instancetype)initWithCoder:(NSCoder *)aDecoder {
    self = [super initWithCoder:aDecoder];
    if (self) {
        self.topInset = 0;
        self.bottomInset = 0;
        self.leftInset = 0;
        self.rightInset = 0;
    }
    return self;
}

- (void)drawTextInRect:(CGRect)rect {
    UIEdgeInsets insets = UIEdgeInsetsMake(self.topInset, self.leftInset, self.bottomInset, self.rightInset);
    [super drawTextInRect:UIEdgeInsetsInsetRect(rect, insets)];
}

- (CGSize)intrinsicContentSize {

    CGSize size = [super intrinsicContentSize];
    return CGSizeMake(size.width + self.leftInset + self.rightInset,
                      size.height + self.topInset + self.bottomInset);
}

@end

আপনি তারপরে XIB বা স্টোরিবোর্ডের মধ্যে শ্রেণি নির্দিষ্ট করার পরে সরাসরি ইন্টারফেস বিল্ডারে আপনার লেবেল ইনসেটগুলি সংশোধন করতে পারেন, ইনসেটগুলির ডিফল্ট মান শূন্য।


0

সহজ পথ

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.

        self.view.addSubview(makeLabel("my title",x: 0, y: 100, w: 320, h: 30))
    }

    func makeLabel(title:String, x:CGFloat, y:CGFloat, w:CGFloat, h:CGFloat)->UILabel{
        var myLabel : UILabel = UILabel(frame: CGRectMake(x,y,w,h))
        myLabel.textAlignment = NSTextAlignment.Right

        // inser last char to right
        var titlePlus1char = "\(title)1"
        myLabel.text = titlePlus1char
        var titleSize:Int = count(titlePlus1char)-1

        myLabel.textColor = UIColor(red:1.0, green:1.0,blue:1.0,alpha:1.0)
        myLabel.backgroundColor = UIColor(red: 214/255, green: 167/255, blue: 0/255,alpha:1.0)


        // create myMutable String
        var myMutableString = NSMutableAttributedString()

        // create myMutable font
        myMutableString = NSMutableAttributedString(string: titlePlus1char, attributes: [NSFontAttributeName:UIFont(name: "HelveticaNeue", size: 20)!])

        // set margin size
        myMutableString.addAttribute(NSFontAttributeName, value: UIFont(name: "HelveticaNeue", size: 10)!, range: NSRange(location: titleSize,length: 1))

        // set last char to alpha 0
        myMutableString.addAttribute(NSForegroundColorAttributeName, value: UIColor(red:1.0, green:1.0,blue:1.0,alpha:0), range: NSRange(location: titleSize,length: 1))

        myLabel.attributedText = myMutableString

        return myLabel
    }


    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

}

0

সহজ প্যাডিং:

import UIKit

    class NewLabel: UILabel {

        override func textRectForBounds(bounds: CGRect, limitedToNumberOfLines numberOfLines: Int) -> CGRect {

            return CGRectInset(self.bounds, CGFloat(15.0), CGFloat(15.0))
        }

        override func drawRect(rect: CGRect) {

            super.drawTextInRect(CGRectInset(self.bounds,CGFloat(5.0), CGFloat(5.0)))
        }

    }

নীচের পৃষ্ঠায় 3.0 সংস্করণ
odemolliens

0

সুইফট 4+

let paragraphStyle = NSMutableParagraphStyle()
paragraphStyle.firstLineHeadIndent = 10

// Swift 4.2++
label.attributedText = NSAttributedString(string: "Your text", attributes: [NSAttributedString.Key.paragraphStyle: paragraphStyle])

// Swift 4.1--
label.attributedText = NSAttributedString(string: "Your text", attributes: [NSAttributedStringKey.paragraphStyle: paragraphStyle])
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.