সুইফট 5-এর জন্য আপডেট হয়েছে
preferredLayoutAttributesFittingAttributes
পুনঃনামকরণ preferredLayoutAttributesFitting
এবং অটো সাইজিং ব্যবহার করুন
সুইফট 4-র জন্য আপডেট হয়েছে
systemLayoutSizeFittingSize
নামকরণ systemLayoutSizeFitting
আইওএস 9 এর জন্য আপডেট হয়েছে
আইওএস 9 এর অধীনে আমার গিটহাব সলিউশন বিরতি দেখার পরে অবশেষে আমি বিষয়টি পুরোপুরি তদন্ত করার সময় পেয়েছি। সেল্ফ সাইজিং সেলগুলির জন্য বিভিন্ন কনফিগারেশনের কয়েকটি উদাহরণ অন্তর্ভুক্ত করার জন্য আমি এখন রেপো আপডেট করেছি। আমার উপসংহারটি হ'ল সেলফ সাইজিং সেলগুলি তত্ত্বের ক্ষেত্রে দুর্দান্ত তবে অনুশীলনে অগোছালো। স্ব-আকার দেওয়ার ঘরগুলি নিয়ে এগিয়ে যাওয়ার সময় একটি সতর্কতার শব্দ।
টি এল; ডিআর
আমার গিটহাব প্রকল্পটি দেখুন
স্ব-আকার দেওয়ার ঘরগুলি কেবল প্রবাহের বিন্যাসের সাহায্যে সমর্থিত তাই আপনি যা ব্যবহার করছেন তা নিশ্চিত হন।
সেলফ সাইজিং সেলগুলি কাজ করার জন্য আপনাকে দুটি জিনিস সেটআপ করতে হবে।
1. সেট estimatedItemSize
করুনUICollectionViewFlowLayout
আপনি estimatedItemSize
সম্পত্তি সেট করার পরে ফ্লো লেআউট প্রকৃতির গতিশীল হয়ে উঠবে ।
self.flowLayout.estimatedItemSize = UICollectionViewFlowLayout.automaticSize
২. আপনার সেল সাবক্লাসে আকার দেওয়ার জন্য সমর্থন যোগ করুন
এটি 2 স্বাদে আসে; স্ব-লেআউট বা কাস্টম ওভাররাইড preferredLayoutAttributesFittingAttributes
।
অটো লেআউট দিয়ে সেলগুলি তৈরি এবং কনফিগার করুন
কোনও কক্ষের জন্য কনফিগারেশন সীমাবদ্ধ করার বিষয়ে একটি উজ্জ্বল এসও পোস্ট আছে বলে আমি এই সম্পর্কে বিস্তারিত জানব না। কেবল সতর্ক থাকুন যে এক্সকোড 6 আইওএস 7 এর সাথে একগুচ্ছ পদার্থ ভেঙে দিয়েছে , তাই আপনি যদি আইওএস 7 সমর্থন করেন তবে আপনাকে অটোরিসাইজিং ম্যাস্কটি সেটের কনটেন্টভিউতে সেট করা আছে তা নিশ্চিত করতে হবে এবং কনটেন্টভিউয়ের সীমানা ঘরের সীমা হিসাবে সেট করা আছে ঘরটি লোড হয় (অর্থাত্ awakeFromNib
)।
আপনার যে বিষয়গুলি সম্পর্কে সচেতন হওয়া দরকার তা হ'ল আপনার সেলটি একটি সারণী দর্শন ঘরের চেয়ে গুরুতরভাবে সীমাবদ্ধ হওয়া দরকার। উদাহরণস্বরূপ, আপনি যদি নিজের প্রস্থকে গতিশীল করতে চান তবে আপনার ঘরের জন্য একটি উচ্চতার সীমাবদ্ধতা প্রয়োজন। তেমনিভাবে, আপনি যদি উচ্চতাটি গতিশীল করতে চান তবে আপনার ঘরের জন্য আপনাকে প্রস্থের একটি সীমাবদ্ধতার প্রয়োজন হবে।
বাস্তবায়ন preferredLayoutAttributesFittingAttributes
আপনার কাস্টম ঘরে
যখন এই ফাংশন বলা হয় আপনার ভিউ ইতিমধ্যে সামগ্রী সহ কনফিগার করা হয়েছে (যেমন cellForItem
বলা হয়েছে)। ধরে নিচ্ছি আপনার সীমাবদ্ধতাগুলি যথাযথভাবে সেট করা হয়েছে আপনি এর মতো একটি বাস্তবায়ন করতে পারেন:
//forces the system to do one layout pass
var isHeightCalculated: Bool = false
override func preferredLayoutAttributesFitting(_ layoutAttributes: UICollectionViewLayoutAttributes) -> UICollectionViewLayoutAttributes {
//Exhibit A - We need to cache our calculation to prevent a crash.
if !isHeightCalculated {
setNeedsLayout()
layoutIfNeeded()
let size = contentView.systemLayoutSizeFitting(layoutAttributes.size)
var newFrame = layoutAttributes.frame
newFrame.size.width = CGFloat(ceilf(Float(size.width)))
layoutAttributes.frame = newFrame
isHeightCalculated = true
}
return layoutAttributes
}
দ্রষ্টব্য আইওএস 9-তে আচরণটি কিছুটা বদলেছে যা আপনি যদি সাবধান না হন তবে আপনার বাস্তবায়নের উপর ক্র্যাশ ঘটতে পারে (আরও দেখুন এখানে )। আপনি যখন প্রয়োগ করেন তখন আপনাকে preferredLayoutAttributesFittingAttributes
অবশ্যই নিশ্চিত করতে হবে যে আপনি একবার কেবল আপনার বিন্যাসের বৈশিষ্ট্যের ফ্রেম পরিবর্তন করেছেন। আপনি যদি এটি না করেন তবে লেআউটটি আপনার প্রয়োগটিকে অনির্দিষ্টকালের জন্য ডেকে আনে এবং শেষ পর্যন্ত ক্রাশ হবে। একটি সমাধান হ'ল আপনার কক্ষের গণনা করা আকারটি ক্যাশে করা এবং আপনি যখনই ঘরটি পুনরায় ব্যবহার করেন বা যে বিষয়বস্তুটি আমি দিয়ে করেছি তেমন পরিবর্তন করে এটিকে অবৈধ করুন toisHeightCalculated
সম্পত্তি ।
আপনার বিন্যাস অভিজ্ঞতা
এই মুহুর্তে আপনার সংগ্রহেভিউতে আপনার 'কার্যকরী' গতিশীল কক্ষ থাকা উচিত। আমার পরীক্ষাগুলির সময় আমি আউট-অফ-বাক্সের সমাধানটি পর্যাপ্তরূপে খুঁজে পাই নি তাই আপনার কাছে থাকলে নির্দ্বিধায় মন্তব্য করুন। এখনও মনে হচ্ছেUITableView
গতিশীল আকারের আইএমএইচও-র যুদ্ধে জয়লাভ করে।
আদেশ সহকারে
খুব সচেতন থাকুন যে আপনি যদি আনুমানিক আইটেম সাইজ গণনা করতে প্রোটোটাইপ সেল ব্যবহার করেন - আপনার XIB আকারের ক্লাস ব্যবহার করে তবে এটি ভেঙে যাবে । এর কারণ হ'ল আপনি যখন আপনার সেলটি XIB থেকে লোড করবেন তখন এর আকারের শ্রেণিটি কনফিগার করা হবে Undefined
। এটি কেবল আইওএস 8 এ বিভক্ত হবে এবং আইওএস 7-র পরে সাইজের ক্লাসটি ডিভাইসের উপর ভিত্তি করে লোড করা হবে (আইপ্যাড = নিয়মিত-কোনও, আইফোন = কমপ্যাক্ট-যেকোন)। আপনি হয় এক্সআইবি লোড না করে আনুমানিক আইটেম সাইজ সেট করতে পারেন, বা আপনি এক্সআইবি থেকে সেলটি লোড করতে পারেন, এটি কালেকশনভিউতে যুক্ত করতে পারেন (এটি বৈশিষ্ট্য সংকলনটি সেট করবে), বিন্যাসটি সম্পাদন করতে পারে এবং তারপরে তদারকির দৃশ্য থেকে অপসারণ করতে পারে। বিকল্পভাবে আপনি নিজের ঘরটি traitCollection
গেটকে ওভাররাইড করতে এবং উপযুক্ত বৈশিষ্ট্যগুলিও ফিরিয়ে দিতে পারেন। এটা আপনার উপর নির্ভর করছে.
আমি যদি কিছু মিস করি তবে আমাকে জানান, আশা করি আমি সহায়তা করেছি এবং ভাগ্য ভালো কোডিং