UILabel উচ্চতা পাঠ্যে সামঞ্জস্য করুন


112

আমার কিছু লেবেল রয়েছে যা আমি তাদের উচ্চতাটিকে পাঠ্যের সাথে সামঞ্জস্য করতে চাই, এই কোডটির জন্য আমি এখন এটি লিখেছি

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

সম্পাদনা করুন:

সমস্যাটি এই কোডের টুকরোটিতে ছিল না, সুতরাং আমার ফিক্সটি নিজেই প্রশ্নটিতে। এটি এখনও অন্যদের জন্য দরকারী হতে পারে!


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

@ ভ্লাদিমিরগ্রিতসেনকো 'সাইজউইটফন্ট' পদ্ধতিগুলি সুইফটে অনুপলব্ধ :(
দ্য বার্গারশট

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

@ দ্য বার্গারশট sizeWithFontসম্ভবত সুইফটের জন্য উপলভ্য নয় Stringতবে এটি উপলভ্য NSStringআপনার তখনও এটিতে কল করতে সক্ষম হওয়া উচিত।
অনোরাক

শেষ পর্যন্ত ত্রুটিটি কিছু অন্যরকম ছিল এবং এই পদ্ধতির সাথে কোনও সম্পর্ক ছিল না। যদিও এটি এখনও অন্যদের জন্য সহায়ক হতে পারে।
দ্য বার্গারশট

উত্তর:


189

আমি এটি কেবল একটি খেলার মাঠে রেখেছি এবং এটি আমার পক্ষে কাজ করে।

সুইফট ৪.০ এর জন্য আপডেট হয়েছে

import UIKit

 func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

let font = UIFont(name: "Helvetica", size: 20.0)

var height = heightForView("This is just a load of text", font: font, width: 100.0)

সুইফট 3:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    return label.frame.height
}

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


এটি আমার জন্য খেলার মাঠে খুব ভাল কাজ করে, ত্রুটিটি এই নির্দিষ্ট জায়গায় উপস্থিত হবে বলে মনে হয় না, যখন আমি এই পদ্ধতির ব্যবহারগুলি সরিয়ে ফেলি তখন এটি কিছু মুদ্রণ বা কেবলমাত্র মন্তব্যগুলির সাথে একটি লাইন সম্পর্কে চমকপ্রদ হয় (তারপরে এটি বলে থাকে EXC_BAD_ACCESS কোড = 2 পাশাপাশি)
দ্য বার্গারশট

6
এটি খেলার মাঠে কাজ করে তবে
এক্সকোড

1
UILabelসাইজ প্রতি নতুন তৈরি করতে আমি কিছুটা দ্বিধা বোধ করি ; যদি এই পদ্ধতিটি layoutSubviewsসম্পূর্ণ বিন্যাসে একাধিকবার আহ্বান করার প্রবণতার সাথে অভ্যন্তরীণভাবে ব্যবহার করা হয়, অতিরিক্ত অবজেক্ট তৈরি বিশেষত স্ক্রোলিংয়ের সময় লক্ষণীয় বিলম্বের প্রবর্তন করতে পারে।
জোড়ায়ার

দিন textRect = textString.boundingRectWithSize (CGSizeMake (320, 2000), বিকল্প: .UsesLineFragmentOrigin, গুণাবলী: textAttributes, প্রসঙ্গ: শূন্য)
সিদ্ধার্থ পাঞ্চোলি এখন

আমি আমার ভিউ কন্ট্রোলারে এই ফাংশনটি কল করতে অক্ষম ... আপনি কি আমাকে বলতে পারেন যে সম্ভাব্য কারণটি কী হতে পারে?
রাউনি

64

আপনি যদি অটোলআউট ব্যবহার করছেন তবে আপনিUILabel কেবল কনফিগার ইউআই দ্বারা উচ্চতা সামঞ্জস্য করতে পারেন ।

IOS8 বা ততোধিকের জন্য

  • আপনার জন্য সীমাবদ্ধ নেতৃত্ব / পিছনে সেট করুন UILabel
  • এবং UILabel1 থেকে 0 এর রেখা পরিবর্তন করুন

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

আইওএস 7 এর জন্য

  • প্রথমত , আপনাকে এর জন্য উচ্চতা যুক্ত করতে হবেUILabel
  • তারপর , থেকে রিলেশন সংশোধন EqualকরতেGreater than or Equal

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

  • শেষUILabel পর্যন্ত, 1 থেকে 0 এর রেখা পরিবর্তন করুন

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

আপনার UILabelপাঠ্যের উপর নির্ভর করে স্বয়ংক্রিয়ভাবে উচ্চতা বৃদ্ধি পাবে


2
এবং যদি লেবেলটি কোনও কক্ষের অভ্যন্তরে থাকে। কখন এবং কীভাবে আপনি সেই অনুযায়ী ঘরের উচ্চতা বৃদ্ধি করবেন?
ওয়ালহি

1
@oyalhi, যদি আপনার লেবেল tableview সেল ভিতরে থাকে তবে দয়া করে আমার অন্যান্য পোস্ট দেখতে stackoverflow.com/a/36277840/5381331
ফান ভ্যান Linh

3
এটি আমার জন্য পুরোপুরি কাজ করেন! সীমাবদ্ধতা সেটআপ করুন, এবং এটি সঠিকভাবে কাজ করবে!
বিল থম্পসন

2
আমার জন্য কাজ করছে না ... একটি ইউআইএবেলে "লেবেল" শব্দটি উচ্চতা = 20 করে makes এটি এই সেটিং পরে 20 অবধি আছে।
গ্যাজেট00

9

আপনি চাইলে আমি এই এক্সটেনশনটি তৈরি করি

extension UILabel {
    func setSizeFont (sizeFont: CGFloat) {
        self.font =  UIFont(name: self.font.fontName, size: sizeFont)!
        self.sizeToFit()
    }
}

8

আমার শক্তিশালী কাজ করার সমাধান রয়েছে।

বিন্যাসে

    _title.frame = CGRect(x: 0, y: 0, width: bounds.width, height: 0)
    _title.sizeToFit()
    _title.frame.size = _title.bounds.size

পাঠ্য সেটারে:

    _title.text = newValue
    setNeedsLayout()

UPD। অবশ্যই এই ইউআইএলবেল সেটিংস সহ:

    _title.lineBreakMode = .ByWordWrapping
    _title.numberOfLines = 0

6

কেবল সেট করে:

label.numberOfLines = 0

প্রবেশ করা পাঠ্যের পরিমাণের ভিত্তিতে লেবেলটি স্বয়ংক্রিয়ভাবে এর উচ্চতা সামঞ্জস্য করে।


27
এটি ইউআইএলবেলকে তার উচ্চতা সামঞ্জস্য করতে সক্ষম করে না।
দ্য বার্গারশট

6

আনোরাকের উত্তরের ভিত্তিতে আমি জোড়িরের উদ্বেগের সাথেও একমত, তাই আমি ইউআইএলবেল সরিয়ে কেবল সিজিফ্লোটকে ফিরিয়ে আনতে কয়েকটি লাইন যুক্ত করেছি, জানি না যে এটি মূল কোডটি ইউআইবেল যোগ না করায় এটি সাহায্য করে কিনা, তবে এটি ত্রুটি ছুঁড়ে না, তাই আমি নীচের কোডটি ব্যবহার করছি:

func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat{

    var currHeight:CGFloat!

    let label:UILabel = UILabel(frame: CGRectMake(0, 0, width, CGFloat.max))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.ByWordWrapping
    label.font = font
    label.text = text
    label.sizeToFit()

    currHeight = label.frame.height
    label.removeFromSuperview()

    return currHeight
}

5

সুইফটে 4.1 এবং এক্সকোড 9.4.1

মাত্র 3 টি পদক্ষেপ

ধাপ 1)

//To calculate height for label based on text size and width
func heightForView(text:String, font:UIFont, width:CGFloat) -> CGFloat {
    let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
    label.numberOfLines = 0
    label.lineBreakMode = NSLineBreakMode.byWordWrapping
    label.font = font
    label.text = text

    label.sizeToFit()
    return label.frame.height
}

ধাপ ২)

//Call this function
let height = heightForView(text: "This is your text", font: UIFont.systemFont(ofSize: 17), width: 300)
print(height)//Output : 41.0

ধাপ 3)

//This is your label
let proNameLbl = UILabel(frame: CGRect(x: 0, y: 20, width: 300, height: height))
proNameLbl.text = "This is your text"
proNameLbl.font = UIFont.systemFont(ofSize: 17)
proNameLbl.numberOfLines = 0
proNameLbl.lineBreakMode = .byWordWrapping
infoView.addSubview(proNameLbl)

5

আনোর্ক প্রস্তাবিত সমাধানটি ইউআইএলবেলের জন্য একটি এক্সটেনশনে গণনা করা সম্পত্তি হিসাবে:

extension UILabel
{
var optimalHeight : CGFloat
    {
        get
        {
            let label = UILabel(frame: CGRectMake(0, 0, self.frame.width, CGFloat.max))
            label.numberOfLines = 0
            label.lineBreakMode = self.lineBreakMode
            label.font = self.font
            label.text = self.text

            label.sizeToFit()

            return label.frame.height
         }
    }
}

ব্যবহার:

self.brandModelLabel.frame.size.height = self.brandModelLabel.optimalHeight

চমৎকার সমাধান! আপনাকে ধন্যবাদ :-)
ক্রিশ্চিনা

সম্পত্তিতে বরাদ্দ করা যায় না: 'উচ্চতা' হ'ল কেবলমাত্র সম্পত্তি।
Amg91

4

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

extension String {

    func heightForWithFont(font: UIFont, width: CGFloat, insets: UIEdgeInsets) -> CGFloat {

        let label:UILabel = UILabel(frame: CGRectMake(0, 0, width + insets.left + insets.right, CGFloat.max))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.ByWordWrapping
        label.font = font
        label.text = self

        label.sizeToFit()
        return label.frame.height + insets.top + insets.bottom
    }
}

label.lineBreakMode = NSLineBreakMode.ByWord এই লাইনটি মোড়ানো আমাকে ধন্যবাদ জানাতে সহায়তা করেছে।
কোডার_এ_ডি

3

এখানে সুইফটে পাঠ্যের উচ্চতা গণনা করতে হবে। তারপরে আপনি রেক্টর থেকে উচ্চতা পেতে পারেন এবং লেবেল বা টেক্সটভিউ ইত্যাদির সীমাবদ্ধতার উচ্চতা সেট করতে পারেন

let font = UIFont(name: "HelveticaNeue", size: 25)!
let text = "This is some really long text just to test how it works for calculating heights in swift of string sizes. What if I add a couple lines of text?"

let textString = text as NSString

let textAttributes = [NSFontAttributeName: font]

let textRect = textString.boundingRectWithSize(CGSizeMake(320, 2000), options: .UsesLineFragmentOrigin, attributes: textAttributes, context: nil)

3

লেবেলের জন্য আপনার গতিশীল উচ্চতা প্রয়োজন যেখানে এই পদ্ধতিটি কল করুন

func getHeightforController(view: AnyObject) -> CGFloat {
    let tempView: UILabel = view as! UILabel
    var context: NSStringDrawingContext = NSStringDrawingContext()
    context.minimumScaleFactor = 0.8

    var width: CGFloat = tempView.frame.size.width

    width = ((UIScreen.mainScreen().bounds.width)/320)*width

    let size: CGSize = tempView.text!.boundingRectWithSize(CGSizeMake(width, 2000), options:NSStringDrawingOptions.UsesLineFragmentOrigin, attributes: [NSFontAttributeName: tempView.font], context: context).size as CGSize

    return size.height
}

3

সুইফট 4.0

self.messageLabel = UILabel (ফ্রেম: সিজিআরেক্ট (x: 70, y: 60, প্রস্থ: UIScreen.main.bounds.width - 80, উচ্চতা: 30)

messageLabel.text = message

messageLabel.lineBreakMode = .byWordWrapping //in versions below swift 3 (messageLabel.lineBreakMode = NSLineBreakMode.ByWordWrapping)    
messageLabel.numberOfLines = 0 //To write any number of lines within a label scope

messageLabel.textAlignment = .center

messageLabel.textColor = UIColor.white

messageLabel.font = messageLabel.font.withSize(12)

messageLabel.sizeToFit()

ব্লককোট এনএসপারাগ্রাফ স্টাইল.লাইনব্র্যাকমোড, অনুচ্ছেদের মধ্যে শব্দের মতো নয়, পুরো অনুচ্ছেদে প্রয়োগ করুন normal এই অঙ্কটি স্বাভাবিক অঙ্কন চলাকালীন এবং ক্ষেত্রে যেমন ফন্টের আকারটি তার সীমানা বাক্সে লেবেলের পাঠ্যকে ফিট করতে হয় উভয় ক্ষেত্রেই কার্যকর হয় effect এই সম্পত্তিটি ডিফল্টরূপে ট্র্যাঙ্কেটিং টেইলে সেট করা আছে।

এই লিঙ্কটি একই কাজ করার স্টোরিবোর্ডের বর্ণনা দেয়


2
কেবলমাত্র কোডের উত্তরগুলি ভাল অনুশীলন হিসাবে বিবেচিত হয় না। আপনার উত্তর কীভাবে প্রশ্নটিকে সম্বোধন করে সে সম্পর্কে কিছু ব্যাখ্যা যুক্ত করার বিষয়ে দয়া করে বিবেচনা করুন।
ইয়ান্নিস

2

সুইফট 4.0

পাঠ্য / লেবেলের উচ্চতা গণনা করার পরিবর্তে, আমি (ডায়নামিক) পাঠ্য সন্নিবেশ করার পরে কেবল লেবেলের আকার পরিবর্তন করি।

ধরে নিচ্ছি যে মাইবেল হ'ল প্রশ্নে থাকা ইউআইএলবেল:

let myLabel = UILabel(frame: CGRect(x: 0, y: 0, width: *somewidth*, height: *placeholder, e.g. 20*))
myLabel.numberOfLines = 0
myLabel.lineBreakMode = .byWordWrapping
...

এবং এখন আসে মজাদার অংশ:

var myLabelText: String = "" {
   didSet {
      myLabel.text = myLabelText
      myLabel.sizeToFit()
   }
}

2

সুইফট 4.1 ক্যালকুলেট ট্যাগ উচ্চতা এক্সটেনশন পদ্ধতি:

extension UILabel {

    func heightForLabel(text:String, font:UIFont, width:CGFloat) -> CGFloat {
        let label:UILabel = UILabel(frame: CGRect(x: 0, y: 0, width: width, height: CGFloat.greatestFiniteMagnitude))
        label.numberOfLines = 0
        label.lineBreakMode = NSLineBreakMode.byWordWrapping
        label.font = font
        label.text = text

        label.sizeToFit()
        return label.frame.height
    }

}

1

সুইফ্ট 5, এক্সকোড 11 স্টোরিবোর্ড পথ। আমি মনে করি এটি আইওএস 9 এবং উচ্চতরর জন্য কাজ করে। আপনি গতিশীল উচ্চতা পেতে উদাহরণস্বরূপ "বিবরণ" লেবেলটি চান, পদক্ষেপগুলি অনুসরণ করুন:

1) বর্ণনার লেবেল নির্বাচন করুন -> বৈশিষ্ট্য পরিদর্শক (পেন্সিল আইকন) এ যান, সেট করুন: লাইন: 0 লাইন ব্রেক: শব্দ মোড়ানো

2) স্টোরিবোর্ড থেকে আপনার ইউআইএলবেল নির্বাচন করুন এবং আকার পরিদর্শক (শাসক আইকন) এ যান, 3) আপনার লেবেলের সাথে ইন্টারঅ্যাক্ট করছে এমন সমস্ত অন্যান্য ইউআইভিউ (লেবেল, বোতাম, চিত্রদর্শন, ইত্যাদি) উপাদানগুলির জন্য "সামগ্রী সংক্ষেপণ প্রতিরোধের অগ্রাধিকার 1 এ যান"।

উদাহরণস্বরূপ, আমার দৃষ্টিতে উল্লিখিতভাবে আমার কাছে ইউআইআইমেজভিউ, শিরোনাম লেবেল এবং বিবরণ লেবেল রয়েছে। আমি কনট্রেশন প্রতিরোধের অগ্রাধিকারটিকে ইউআইআইমেজভিউতে এবং শিরোনাম লেবেলটিকে 1 এ এবং বর্ণনা লেবেলের জন্য 750 এ সেট করেছি This এটি প্রয়োজনীয় উচ্চতা যতটা নেবে একটি বিবরণ লেবেল তৈরি করবে।


0

দ্রুত গতিতে লেবেলকে গতিশীল করতে, উচ্চতার প্রতিবন্ধকতা দেবেন না এবং স্টোরিবোর্ডে 0 টি রেখার লেবেল তৈরি করুন নীচের সীমাবদ্ধতাও দিন এবং এটি আমার সামগ্রীর আকার অনুযায়ী গতিশীল লেবেল হ্যান্ডেল করার সেরা উপায়।


0

আপনি sizeThatFitsফাংশন ব্যবহার করতে পারেন ।

উদাহরণ স্বরূপ:

label.sizeThatFits(superView.frame.size).height

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