ভিউউইল অ্যাপয়ারের মধ্যে ফ্রেম পরিবর্তনগুলি দেখুন:


85

আমি আমার আবেদন, যেখানে একটি সংযুক্ত একটি অদ্ভুত আচরণের আবিষ্কৃত হয়েছে IBOutletআমার দৃশ্য নিয়ামক কল মধ্যে তার সংযুক্ত দৃশ্য এর ফ্রেম আছে viewWillAppear:এবং viewDidAppear:। আমার UIViewControllerসাবক্লাসে প্রাসঙ্গিক কোডটি এখানে :

-(void)viewWillAppear:(BOOL)animated {
    NSLog(@"%@", self.scrollView);
}

-(void)viewDidAppear:(BOOL)animated {
    NSLog(@"%@", self.scrollView);
}

এবং ফলস্বরূপ লগ আউটপুট:

MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 0; 0 0); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>
MyApp[61880:c07] <UIScrollView: 0x1057eff0; frame = (0 44; 320 416); clipsToBounds = YES; autoresize = TM+BM; gestureRecognizers = <NSArray: 0x10580100>; layer = <CALayer: 0x1057f210>; contentOffset: {0, 0}>

যা পরিষ্কারভাবে দেখায় যে দুটি কলের মধ্যে ফ্রেম পরিবর্তন হচ্ছে। আমি viewDidLoadপদ্ধতিতে দৃশ্যের সাথে সেটআপ করতে চেয়েছিলাম , তবে পর্দায় না আসা পর্যন্ত যদি সামগ্রীটি আমার জন্য পরিবর্তিত না হয়, তবে এটি বেশ অকেজো বলে মনে হচ্ছে। কি হতে পারে?


4
আপনি অটোলেআউট ব্যবহার করছেন? আপনি এই দৃষ্টিভঙ্গি ইন্টারফেস বিল্ডার বা প্রোগ্রাম্যাটিকভাবে যুক্ত করছেন?
Andrea

অটোলেআউট সক্ষম হয়েছে এবং স্টোরিবোর্ড থেকে এই ভিউ আইবিতে তৈরি করা হয়েছে।
জুমহাইন

4
আমি কখনও স্টোরিবোর্ড ব্যবহার করি নি, তবে সম্ভবত এটি সঠিক। অটোলেআউট ইঞ্জিন এর গণনা শুরু করলে আপনার দর্শনগুলির অটোলেআউট ফ্রেম সেট করা হয়। আপনার ভিউ কন্ট্রোলারের - (অকার্যকর) ভিউডিডলআউটসউবভিউস এমপিথোডের সুপারের পরে ঠিক একই জিনিসটি জিজ্ঞাসা করার চেষ্টা করুন।
Andrea

এটি সফলভাবে আমার ইভেন্টটিকে সঠিক সময়ে ট্রিগার করে, তবে যখনই আমি ভিউটিতে কোনও অ্যানিমেশন করি তখন সেই পদ্ধতিটিও ডাকা হয়।
জুমহাইন

4
viewDidLayoutSubviewsসঠিক পথ ছিল। আমাকে কেবলমাত্র আমার সমস্ত সামগ্রী একটি সাবউভিউতে রাখতে হয়েছিল যাতে যখনই আমি প্রধান দৃশ্যের ফ্রেমটি পরিবর্তন করি তবে পদ্ধতিটি পুনরায় কল করা হবে না।
জুমহিন

উত্তর:


112

Autolayoutআমরা কীভাবে আমাদের মতামতের জিইউআই ডিজাইন করি এবং বিকাশ করি তাতে একটি বিশাল পরিবর্তন আনা হয়েছে। প্রধান পার্থক্যগুলির মধ্যে একটি হ'ল autolayoutআমাদের দর্শন মাপগুলি তাত্ক্ষণিকভাবে পরিবর্তন করে না, তবে কেবল তখনই ট্রিগার করা হয়, এর অর্থ একটি নির্দিষ্ট সময়ে but এটি এর মতো কাজ করে যখন আমরা পুরানো অটোরেসাইজিং মাস্ক মিশ্রিত করতে চাই এবং যখন সমস্যা দেখা দেয় তখন অটোলেআউট হয়। আমাদের সত্যই শীঘ্রই অটোলেআউট বাস্তবায়ন সম্পর্কে চিন্তা করা উচিত এবং অটোলেআউট ভিত্তিক ভিউ হায়ারার্কিতে পুরানো পদ্ধতির মিশ্রণ এড়াতে চেষ্টা করা উচিত। একটি ধারক দর্শন থাকা ভাল যা কেবলমাত্র অটোরাইজিং মাস্কগুলি ব্যবহার করে যেমন একটি ভিউ কন্ট্রোলারের মূল দৃষ্টিভঙ্গি, তবে আমরা মিশ্রণের চেষ্টা না করি তবে ভাল।-setNeedDisplay
আমার কাছে বড় চ্যালেঞ্জটি তা বোঝা ও গ্রহণ করা ছিল, আমাদের আর অটোরিসাইজিং মাস্ক ব্যবহার করার দরকার নেই, এবং ফ্রেম আমাদের দৃষ্টিভঙ্গি রাখার ক্ষেত্রে অকেজো সম্পত্তি হয়ে দাঁড়িয়েছে। আমাদের আর দেখার অবস্থান সম্পর্কে চিন্তা করার দরকার নেই, তবে আমাদের কীভাবে একে অপরের সাথে সম্পর্কিত জায়গাতে দেখতে চাই তা চিন্তা করা উচিত।


আমি কখনও স্টোরিবোর্ড ব্যবহার করি নি, তবে সম্ভবত এটি সঠিক। অটোলেআউট ব্যবহার করে, অটোলেআউট ইঞ্জিন যখন গণনা শুরু করবে তখন আপনার দর্শনগুলির ফ্রেম সেট করা হবে। - (void)viewDidLayoutSubviewsআপনার ভিউ কন্ট্রোলারের পদ্ধতির সুপারের পরে ঠিক একই জিনিসটি জিজ্ঞাসা করার চেষ্টা করুন ।
অটোলেআউট ইঞ্জিনটি আপনার দর্শনগুলির ফ্রেমগুলি গণনা শেষ করার পরে এই পদ্ধতিটি বলা হয়।


6
- (অকার্যকর) ভিউডিডলআউটআউটভিউগুলি আমার পক্ষে উত্তর! অনেক ধন্যবাদ!
ফ্রিজ দ্য স্নেইল

এই উত্তরটি সত্যই সঠিক নয়। হ্যাঁ অবশ্যই, এখন (5?) বছর ধরে আপনাকে অটোলেআউট ব্যবহার করতে হবে। তবে এমন অনেকগুলি পরিস্থিতি রয়েছে ( অটোলেআউট ব্যবহার করে ) যেখানে আপনার প্রয়োজন, বলতে, স্ক্রিনে কিছু যুক্ত করতে হবে, "এটি ব্যবহারকারীর সামনে উপস্থিত হওয়ার ঠিক আগে"। (আপনি যদি ভিউডিডিঅ্যাপারে এটি করেন তবে আপনি একটি ঝাঁকুনি পাবেন view
ফ্যাটি

add something on a screen, "just before it appears to the user". The actual answer is indeed to use viewDidLayoutSubviews.... আপনি সেই দৃশ্যটি অনেক বার দেখাতে যাচ্ছেন
Andrea

156

ডকুমেন্টেশন থেকে :

viewWillAppear:

ভিউ কন্ট্রোলারকে জানায় যে এর ভিউটি একটি ভিউ হায়ারার্কিতে যুক্ত হতে চলেছে।

viewDidAppear:

ভিউ কন্ট্রোলারকে জানায় যে এর ভিউটি একটি ভিউ হায়ারার্কিতে যুক্ত করা হয়েছিল।

ফলস্বরূপ সাবউভিউগুলির ফ্রেমগুলি এখনও এতে সেট করা হয়নি viewWillAppear:

স্ক্রিনে ভিউ উপস্থাপনের আগে আপনার ইউআইকে সংশোধন করার উপযুক্ত পদ্ধতিটি হ'ল:

viewDidLayoutSubviews

ভিউ কন্ট্রোলারকে জানায় যে এর দৃশ্যে সবেমাত্র তার সংক্ষিপ্তসারগুলি রেখে গেছে।


4
উঘ, যে বিরক্তিকর। এমনকি ডকুমেন্টেশনের শব্দের দ্বারা এটি দেখে মনে হচ্ছে ভিউ উইলএপ্পার: এবং ভিউডিডঅ্যাপার: একে অপরের পরে সরাসরি হওয়া উচিত।
জুমহাইন

2 মাস এই উত্তরের জন্য অপেক্ষা করছি ... ধন্যবাদ আমি এটি পেয়েছি !! আপনাকে অনেক ধন্যবাদ!
রাফায়েল রুইজ মুয়াজ

6
লক্ষ করা উচিত যে viewDidLayoutSubviewsএকাধিকবার ডাকা হবে এবং সর্বদা একই ফ্রেমের সাথে নয়, (আমি মনে করি এটি কখনও কখনও প্রথম কলটিতে সিজিআরেক্টজারোর সাথে ডাকা হয়)। এটি প্রতিটি যুক্ত করা সংক্ষিপ্তসার এবং ভিউতে থাকা অন্যান্য পরিবর্তনের জন্য আহ্বান জানায়।
বাউরউউজিক

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

আমরা এর নীচে যেতে হবে! viewDidLayoutSubviews ভয়াবহ, seNeedDisplay কাজ করে না
Yaro

9

কল

স্ব.স্ক্রোলভিউ.লেআউটআউটফিড ()

আপনার viewWillAppearপদ্ধতিতে এরপরে আপনি এটির ফ্রেমটি অ্যাক্সেস করতে পারবেন এবং এটি প্রিন্ট করার সাথে একই মান হবেviewDidAppear


4
না, এটি সঠিক নয়। উদাহরণ: আপনার পর্দায় একটি নেভিগেশন বার রয়েছে (আপনার এনএভি কন্ট্রোলার থেকে)। লেআউটআইফনেড () এর পরেও, নাবারের উচ্চতা অন্তর্ভুক্ত নয়, সুতরাং আপনার ফ্রেমের আকার পরিবর্তন হবে।
xaphod

এই IS একটি ভালো উপায় যাতে এটি দৃশ্য বিন্যাস কল অনুক্রমের সর্বত্র সামঞ্জস্যপূর্ণ scrollView ফ্রেম তার superview মধ্যে সীমাবদ্ধতা আবদ্ধ থাকে একটি scrollview ফ্রেম মাত্রা একটি পুনরায় হিসাব বলপূর্বক।
স্মাকাস

4

আমার ক্ষেত্রে, সমস্ত ফ্রেম সম্পর্কিত পদ্ধতিতে সরানো

override func viewWillLayoutSubviews()

পুরোপুরি কাজ করেছে (আমি স্টোরিবোর্ড থেকে বাধাগুলি সংশোধন করার চেষ্টা করছিলাম)।

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