মাল্টিলাইন লেবেল (ওয়ার্ড র্যাপে লাইনব্রেক সেট সহ) স্ট্যাক ভিউতে রাখার সময়, লেবেলটি সাথে সাথে লাইনব্রেকটি হারাবে এবং পরিবর্তে এক লাইনে লেবেল পাঠ্য প্রদর্শন করবে।
কেন এটি হচ্ছে এবং কোনও স্ট্যাক ভিউয়ের মধ্যে কীভাবে একাধিক লাইনের লেবেল সংরক্ষণ করে?
মাল্টিলাইন লেবেল (ওয়ার্ড র্যাপে লাইনব্রেক সেট সহ) স্ট্যাক ভিউতে রাখার সময়, লেবেলটি সাথে সাথে লাইনব্রেকটি হারাবে এবং পরিবর্তে এক লাইনে লেবেল পাঠ্য প্রদর্শন করবে।
কেন এটি হচ্ছে এবং কোনও স্ট্যাক ভিউয়ের মধ্যে কীভাবে একাধিক লাইনের লেবেল সংরক্ষণ করে?
উত্তর:
সঠিক উত্তরটি এখানে:
https://stackoverflow.com/a/43110590/566360
UILabel
ভিতরে একটি এম্বেড করুন UIView
(সম্পাদক -> এম্বেড ইন -> দেখুন)UILabel
করুন UIView
(উদাহরণস্বরূপ, পিছনে স্থান, শীর্ষ স্থান এবং তদারকির সীমাবদ্ধতার জন্য শীর্ষস্থানীয় স্থান)UIStackView
বাড়িয়ে দেবে UIView
সঠিকভাবে মাপসই এবং UIView
সীমাবদ্ধ হবে UILabel
একাধিক লাইনের জন্য।
UIView
শেননিগান প্রয়োজন নেই।
একটি অনুভূমিক স্ট্যাক ভিউয়ের জন্য যা UILabel
ইন্টারফেস বিল্ডারে প্রথমে সেট করে এর মতামতগুলির একটি হিসাবে এটি রয়েছে label.numberOfLines = 0
। এটিতে লেবেলটিকে 1 টির বেশি লাইন থাকতে দেওয়া উচিত। প্রথমদিকে যখন স্ট্যাক ভিউটি ছিল তখন এটি আমার পক্ষে কাজ করতে ব্যর্থ হয়েছিল stackView.alignment = .fill
। এটি সহজভাবে কাজ করতে stackView.alignment = .center
। লেবেলটি এখন একাধিক লাইনে প্রসারিত করতে পারে UIStackView
।
অ্যাপল ডকুমেন্টেশন বলেছেন
ভরাট সারিবদ্ধকরণ ব্যতীত অন্য সারিবদ্ধকরণের জন্য, স্ট্যাকের অক্ষের সাথে লম্ব লম্বরের গণনা করার সময় স্ট্যাক ভিউ প্রতিটি সাজানো ভিউর অভ্যন্তরীণ সামগ্রী আকার বৈশিষ্ট্যটি ব্যবহার করে
এখানে শব্দ বাদে নোট করুন। যখন .fill
অনুভূমিক ব্যবহৃত হয় তখন UIStackView
সাজানো সাবউভিউ আকারগুলি ব্যবহার করে উল্লম্বভাবে নিজেকে আকার পরিবর্তন করে না।
.alignment
ইউআইএসট্যাকভিউয়ের যেটি আপনাকে ইউআইএলবেল .fill
নয় , কিছুতে সেট করতে হবে যা দেওয়া উদাহরণে কিছুটা বিভ্রান্তিকর label.alignment = .center
। আমি মনে করি এটি হওয়া উচিতstackView.alignment = .center
multiLine
যদি একটি নির্দিষ্ট প্রস্থ না দেন তবে স্ট্যাক ভিউ এখনও বাড়বে না । যখন আমরা এর প্রস্থ স্থির করি তখন যখন প্রস্থটি দেখানো হয়েছে তখন এটি মাল্টলাইনে বিভক্ত হবে:যদি আমরা স্ট্যাক ভিউতে একটি নির্দিষ্ট প্রস্থ না দিয়ে থাকি তবে জিনিসগুলি দ্বিধাগ্রস্ত হয়। আর কতক্ষণ লেবেলের সাথে স্ট্যাক ভিউ বাড়বে (যদি লেবেলের মানটি গতিশীল হয়)?
আশা করি এটি আপনার সমস্যার সমাধান করতে পারে।
preferredMaxLayoutWidth
মধ্যে viewDidLayoutSubviews
আপনার লেবেলের জন্য UIViewController
অথবা layoutSubviews
আপনি উপশ্রেণী UIView
।
ইউআইএলবেলে পছন্দসইম্যাক্স লেআউটউইথকে সেট করা আমার পক্ষে কাজ করেছিল
self.myLabel.preferredMaxLayoutWidth = self.bounds.size.width;
.center
এবং ইউআইভিউ-র ভিতরে আমার সত্যিই আমার লেবেলের প্রয়োজন নেই।
উপরের সমস্ত পরামর্শ দেওয়ার পরেও আমি পেয়েছি ইউআইএসট্যাকভিউয়ের জন্য কোনও বৈশিষ্ট্য পরিবর্তনের প্রয়োজন নেই। আমি কেবল নিম্নলিখিত হিসাবে ইউআইএলবেলগুলির বৈশিষ্ট্যগুলি পরিবর্তন করেছি (লেবেলগুলি ইতিমধ্যে উল্লম্ব স্ট্যাক ভিউতে যুক্ত করা হয়েছে):
সুইফট 4 উদাহরণ:
[titleLabel, subtitleLabel].forEach(){
$0.numberOfLines = 0
$0.lineBreakMode = .byWordWrapping
$0.setContentCompressionResistancePriority(UILayoutPriority.required, for: .vertical)
}
আইওএস 9+
[textLabel sizeToFit]
UILabel এর পাঠ্য সেট করার পরে কল করুন।
সাইজ টোফিট পছন্দসই ম্যাক্সউইথ ব্যবহার করে মাল্টলাইন লেবেলটিকে পুনরায় বিন্যাস করবে। লেবেল স্ট্যাকভিউকে পুনরায় আকার দেবে, যা ঘরের আকার পরিবর্তন করবে। সামগ্রী ভিউতে স্ট্যাক ভিউ পিন করার পাশাপাশি কোনও অতিরিক্ত বাধাও প্রয়োজন।
UIStackView
বহুরেখার সমন্বয়ে উল্লম্বের সম্পূর্ণ উদাহরণ রয়েছে UILabel
।লেবেলগুলি স্ট্যাকভিউয়ের প্রস্থের ভিত্তিতে মোড়ানো এবং স্ট্যাকভিউয়ের উচ্চতা লেবেলের মোড়ানো উচ্চতার ভিত্তিতে। (এই পদ্ধতির সাথে আপনার একটিতে লেবেল এম্বেড করার দরকার নেই UIView
)) (সুইফ্ট 5, আইওএস 12.2)
// A vertical stackview with multiline labels and automatic height.
class ThreeLabelStackView: UIStackView {
let label1 = UILabel()
let label2 = UILabel()
let label3 = UILabel()
init() {
super.init(frame: .zero)
self.translatesAutoresizingMaskIntoConstraints = false
self.axis = .vertical
self.distribution = .fill
self.alignment = .fill
label1.numberOfLines = 0
label2.numberOfLines = 0
label3.numberOfLines = 0
label1.lineBreakMode = .byWordWrapping
label2.lineBreakMode = .byWordWrapping
label3.lineBreakMode = .byWordWrapping
self.addArrangedSubview(label1)
self.addArrangedSubview(label2)
self.addArrangedSubview(label3)
// (Add some test data, a little spacing, and the background color
// make the labels easier to see visually.)
self.spacing = 1
label1.backgroundColor = .orange
label2.backgroundColor = .orange
label3.backgroundColor = .orange
label1.text = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi."
label2.text = "Hello darkness my old friend..."
label3.text = "When I wrote the following pages, or rather the bulk of them, I lived alone, in the woods, a mile from any neighbor, in a house which I had built myself, on the shore of Walden Pond, in Concord, Massachusetts, and earned my living by the labor of my hands only."
}
required init(coder: NSCoder) { fatalError("init(coder:) has not been implemented") }
}
এটি একটি নমুনা ViewController
এটি ব্যবহার করে।
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let myLabelStackView = ThreeLabelStackView()
self.view.addSubview(myLabelStackView)
// Set stackview width to its superview.
let widthConstraint = NSLayoutConstraint(item: myLabelStackView, attribute: NSLayoutConstraint.Attribute.width, relatedBy: NSLayoutConstraint.Relation.equal, toItem: self.view, attribute: NSLayoutConstraint.Attribute.width, multiplier: 1, constant: 0)
self.view.addConstraints([widthConstraint])
}
}
যোগ UIStackView
সম্পত্তি,
stackView.alignment = .fill
stackView.distribution = .fillProportionally
stackView.spacing = 8.0
stackView.axis = .horizontal
ভিতরে লেবেল যুক্ত করার পরিবর্তে UIView
যা প্রয়োজন হয় না UITableViewCell
I
নীচে একটি এর ভিতরে একটি লাইন বিরতি সহ মাল্টি-লাইন লেবেলের একটি খেলার মাঠ বাস্তবায়ন রয়েছে UIStackView
। এটি UILabel
অভ্যন্তরীণ যে কোনও কিছু এম্বেড করার প্রয়োজন নেই এবং এটি এক্সকোড 9.2 এবং সুইফট 4 দিয়ে পরীক্ষা করা হয়েছে আশা করি এটি সহায়ক helpful
import UIKit
import PlaygroundSupport
let containerView = UIView()
containerView.frame = CGRect.init(x: 0, y: 0, width: 400, height: 500)
containerView.backgroundColor = UIColor.white
var label = UILabel.init()
label.textColor = .black
label.numberOfLines = 0
label.translatesAutoresizingMaskIntoConstraints = false
label.text = "This is an example of sample text that goes on for a long time. This is an example of sample text that goes on for a long time."
let stackView = UIStackView.init(arrangedSubviews: [label])
stackView.translatesAutoresizingMaskIntoConstraints = false
stackView.axis = .vertical
stackView.distribution = .fill
stackView.alignment = .fill
containerView.addSubview(stackView)
stackView.centerXAnchor.constraint(equalTo: containerView.centerXAnchor).isActive = true
stackView.centerYAnchor.constraint(equalTo: containerView.centerYAnchor).isActive = true
stackView.widthAnchor.constraint(equalTo: containerView.widthAnchor).isActive = true
stackView.heightAnchor.constraint(equalTo: containerView.heightAnchor).isActive = true
PlaygroundPage.current.liveView = containerView
সিস্টেমের বিন্যাসে এটিকে সংক্ষিপ্তসারগুলি আঁকার জন্য উত্স, প্রস্থ এবং উচ্চতা নির্ধারণ করা উচিত, এক্ষেত্রে আপনার সমস্ত পূর্বরূপের একই অগ্রাধিকার রয়েছে, এটি বিন্দুতে দ্বন্দ্ব তৈরি করে, বিন্যাস সিস্টেমটি ভিউগুলির মধ্যে নির্ভরতা জানেন না, যা প্রথম, দ্বিতীয় এবং আরও আঁকায়
আপনার স্ট্যাক ভিউটি অনুভূমিক বা উল্লম্ব এবং কোনটি একাধিক রেখায় পরিণত হতে চান তার উপর নির্ভর করে সেট স্ট্যাক সাবভিউগুলি সংক্ষেপণ একাধিক লাইনের সাথে সমস্যার সমাধান করবে। stackOtherSubviews .setContentCompressionResistancePriority(.defaultHight, for: .horizontal)
lblTitle.setContentCompressionResistancePriority(.defaultLow, for: .horizontal)
আমার ক্ষেত্রে, আমি পূর্ববর্তী পরামর্শগুলি অনুসরণ করেছি, তবে আমার পাঠ্যটি কেবলমাত্র ল্যান্ডস্কেপ সত্ত্বেও একটি একক লাইনে ছাঁটা হচ্ছে। দেখা যাচ্ছে, আমি \0
লেবেলের পাঠ্যে একটি অদৃশ্য নাল চরিত্র খুঁজে পেয়েছি যা অপরাধী ছিল। এটি অবশ্যই sertedোকানো ইম ড্যাশ প্রতীকটির সাথে অবশ্যই চালু করা হয়েছিল। এটি আপনার ক্ষেত্রেও ঘটছে কিনা তা দেখতে, আপনার লেবেলটি নির্বাচন করতে এবং এর পাঠ্যটি পরীক্ষা করতে দেখুন ডিবাগারটি দেখুন use
এক্সকোড 9.2:
স্ট্রিংবোর্ডটি সেট করার পরে অদ্ভুত দেখাবে। প্রকল্প চালানোর চিন্তা করবেন না। চলার সময় আপনার স্টোরিবোর্ড সেটআপ অনুসারে সমস্ত কিছু পুনরায় আকার দেবে। আমি মনে করি স্টোরবোর্ডে এটির মতো বাগ।
টিপস: সর্বশেষে "লাইনারের সংখ্যা 0" এ সেট করুন। আপনি যখন অন্য কোনও ভিউ সম্পাদনা করতে চান এবং পুনরায় সম্পাদনা করার পরে 0 তে সেট করুন reset
আমার জন্য কি কাজ!
স্ট্যাকভিউ: প্রান্তিককরণ: ভরাট, বিতরণ: পূরণ, সুপারভাইজার প্রান্তের সীমাবদ্ধ আনুপাতিক প্রস্থ 0.8,
লেবেল: কেন্দ্র এবং লাইন = 0
যে কেউ এখনও এটি কাজ করতে পারে না। সেই ইউআইএলবেলে সর্বনিম্ন ফন্ট স্কেল দিয়ে অটোশ্রিংকে সেট করার চেষ্টা করুন।
এটি প্রায় @ অ্যান্ডির উত্তরের মতো, তবে আপনি আমার জন্য UILabel
অতিরিক্ত UIStackview
, উল্লম্বভাবে কাজ করতে পারেন।