আমি এন 8 গ্রে এর উত্তরটি যোগ করতে চাই যে কিছু ক্ষেত্রে আপনাকে তার setNeedsLayoutপরে কল করতে হবে layoutIfNeeded।
উদাহরণস্বরূপ বলা যাক যে আপনি ইউআইভিউউ প্রসারিত একটি কাস্টম ভিউ লিখেছেন, যাতে সাবভিউগুলির অবস্থান জটিল এবং অটোরেসাইজিং ম্যাস্ক বা আইওএস 6 অটোলাউট দিয়ে করা যায় না। ওভাররাইড করে কাস্টম পজিশনিং করা যায় layoutSubviews।
উদাহরণ হিসাবে, আসুন আমরা বলি যে আপনার কাছে একটি কাস্টম ভিউ রয়েছে যার একটি contentViewসম্পত্তি এবং edgeInsetsসম্পত্তি রয়েছে যা কনটেন্টভিউয়ের চারপাশে মার্জিন সেট করতে দেয়। layoutSubviewsএই মত দেখতে হবে:
- (void) layoutSubviews {
self.contentView.frame = CGRectMake(
self.bounds.origin.x + self.edgeInsets.left,
self.bounds.origin.y + self.edgeInsets.top,
self.bounds.size.width - self.edgeInsets.left - self.edgeInsets.right,
self.bounds.size.height - self.edgeInsets.top - self.edgeInsets.bottom);
}
আপনি যখনই edgeInsetsসম্পত্তি পরিবর্তন করেন আপনি যদি ফ্রেম পরিবর্তন অ্যানিমেট করতে সক্ষম হতে চান তবে আপনাকে edgeInsetsসেটারটি নীচে ওভাররাইড করতে হবে এবং setNeedsLayoutতারপরে কল করতে হবে layoutIfNeeded:
- (void) setEdgeInsets:(UIEdgeInsets)edgeInsets {
_edgeInsets = edgeInsets;
[self setNeedsLayout]; //Indicates that the view needs to be laid out
//at next update or at next call of layoutIfNeeded,
//whichever comes first
[self layoutIfNeeded]; //Calls layoutSubviews if flag is set
}
এইভাবে, আপনি যদি নিম্নলিখিতটি করেন, যদি আপনি কোনও অ্যানিমেশন ব্লকের অভ্যন্তরে এজসিট সম্পত্তি পরিবর্তন করেন তবে সামগ্রীভিউয়ের ফ্রেম পরিবর্তন অ্যানিমেটেড হবে।
[UIView animateWithDuration:2 animations:^{
customView.edgeInsets = UIEdgeInsetsMake(45, 17, 18, 34);
}];
যদি আপনি সেটএডিজিনেটস পদ্ধতিতে লেআউটআইফনেডে কলটি যোগ না করেন তবে অ্যানিমেশনটি কাজ করবে না কারণ পরবর্তী লেসনচক্রটিতে লেআউটসুভিউগুলি কল হবে, যা এনিমেশন ব্লকের বাইরে কল করার সমতুল্য।
যদি আপনি কেবল সেটএডিজিনেটস পদ্ধতিতে লেআউটআইফিডকে কল করেন তবে সেটনিডস লেআউট পতাকাটি সেট না হওয়ার কারণে কিছুই ঘটবে না।