it-swarm.asia

عرض تغييرات الإطار بين viewWillAppear: و viewDidAppear:

لقد اكتشفت سلوكًا غريبًا في التطبيق الخاص بي ، حيث يحتوي 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 ، لكن إذا لم يكن المحتوى متاحًا لي لتغييره حتى يتم عرضه على الشاشة ، فإن ذلك يبدو عديم الجدوى. ماذا يمكن أن يحدث؟

83
Jumhyn

Autolayout قام بتغيير كبير في كيفية تصميم وتطوير واجهة المستخدم الرسومية لآرائنا. أحد الاختلافات الرئيسية هو أن autolayout لا يغير أحجام عرضنا على الفور ، ولكن فقط عندما يتم تشغيله ، فهذا يعني في وقت معين ، ولكن يمكننا إجباره على إعادة حساب قيودنا على الفور أو وضع علامة عليها "في حاجة" إلى التخطيط . وهي تعمل مثل -setNeedDisplay.
كان التحدي الكبير بالنسبة لي هو فهم وقبول ذلك ، لم نعد بحاجة إلى استخدام أقنعة الاستعادة الذاتية ، وأصبح الإطار خاصية عديمة الفائدة في وضع وجهات نظرنا. لم نعد بحاجة إلى التفكير في موضع العرض بعد الآن ، ولكن يجب أن نفكر في الطريقة التي نريد رؤيتها بها في مساحة مرتبطة ببعضها البعض.
عندما نرغب في مزج قناع الاستعادة التلقائية القديم والوقوع التلقائي عند ظهور المشاكل. يجب أن نفكر في تطبيق autolayout قريبًا وأن نحاول تجنب خلط النهج القديم في تسلسل هرمي للعرض يعتمد على autolayout.
من الجيد أن يكون لديك عرض حاوية يستخدم أقنعة autoresizing فقط ، مثل طريقة العرض الرئيسية لوحدة تحكم العرض ، ولكن من الأفضل إذا لم نحاول المزج.
لم أستخدم مطلقًا القصة المصورة ، لكن على الأرجح أنها صحيحة. باستخدام Autolayout ، يتم تعيين إطار طرق العرض الخاصة بك عندما يبدأ محرك autolayout في حسابه. حاول أن تسأل نفس الشيء مباشرة بعد طريقة - (void)viewDidLayoutSubviews الفائقة لوحدة التحكم في طريقة العرض الخاصة بك.
تُسمى هذه الطريقة عندما ينتهي محرك التحرير التلقائي لحساب إطارات طرق العرض الخاصة بك.

107
Andrea

من الوثائق:

viewWillAppear:

يخطر وحدة تحكم العرض بأن عرضه على وشك أن يضاف إلى التسلسل الهرمي للعرض.

viewDidAppear:

يخطر وحدة تحكم العرض التي تمت إضافتها إلى تسلسل هرمي للعرض.

نتيجةً لذلك ، لم يتم تعيين إطارات المقاطع الفرعية في viewWillAppear:

الطريقة المناسبة ل تعديل واجهة المستخدم الخاصة بك قبل عرض طريقة العرض على الشاشة هي:

viewDidLayoutSubviews

يخطر وحدة تحكم العرض بأن طريقة العرض الخاصة بها وضعت للتو عروضها الفرعية.

153
George Sachpatzidis

مكالمة

self.scrollView.layoutIfNeeded ()

في طريقة viewWillAppear. بعد ذلك ، يمكنك الوصول إلى إطارها وسيكون لها نفس القيمة التي تطبع بها في viewDidAppear

7
andrei

في حالتي ، نقل جميع الأساليب المتعلقة بالإطار إلى

override func viewWillLayoutSubviews()

عملت تماما (كنت أحاول تعديل القيود من القصة المصورة).

3
Siddhesh Mahadeshwar