سؤال

في بعض تصاميم التطبيقات الخاصة بي أو لبعض عمليات UIViews فقط ، بعد NavigationController من PushViewController من NavigationController ، سيتم تحويل وجهة نظري الجديدة من النافذة بواسطة ارتفاع شريط الحالة. نتيجة لذلك ، سأضع هذا الرمز في طريقة ViewDidload.

CGRect  frameAt = [self.view frame];
CGRect  statusBarFrame = [[UIApplication sharedApplication] statusBarFrame];
frameAt.origin.y += statusBarFrame.size.height;
[self.view setFrame: frameAt];

ليس من المنطقي بالنسبة لي أن هذا هو نية Xcode و Builder للواجهة ، لذلك أظن أنني أفعل شيئًا خاطئًا بشكل أساسي في SDK أثناء تصميم رأيي. علاوة على ذلك ، في المناسبة النادرة التي لا أضطر فيها إلى تغيير وجهة نظري ، لا أعرف حقًا الفرق في مقاربات التصميم.

لاحظ أيضًا أن معظم الوقت أحاول تصميم وجهات نظري باستخدام IB ، مع بعض التخصيص البسيط.

هل يواجه أي شخص آخر هذا ويعرف ماذا يفعلون لإصلاحه دون مثل هذا الرمز؟

هل كانت مفيدة؟

المحلول

لقد استخدمت رمز نموذج NAVBAR من Apple لمحاولة إعادة إنتاج هذه المشكلة.

يتم تنفيذ ApplicationDidFinishLaunching في الأصل على هذا النحو:

[window addSubview:navigationController.view];
[window makeKeyAndVisible];

إذا قمت بتغييره إلى هذا:

UIViewController *shellController = [[UIViewController alloc] initWithNibName:nil bundle:nil];
[shellController.view addSubview:navigationController.view];
[window addSubview:shellController.view];
[window makeKeyAndVisible];

ثم أحصل على الفجوة.

ولكن إذا قمت بذلك فقط:

UIView *shell = [[UIView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
[shell addSubview:navigationController.view];
[window addSubview:shell];
[window makeKeyAndVisible];

ثم يبدو كل شيء طبيعيًا.

لذلك أعتقد أن كل وحدة تحكم عرض سوف تعوض عرضها إذا كانت وحدة التحكم في عرض الجذر. لكن وحدة تحكم التنقل تتجاوز هذا السلوك لتعويض وجهة نظره بغض النظر عما إذا كان وحدة تحكم عرض الجذر. لذلك أود أن أقول إن الفجوة الخاصة بك تظهر لأنك حصلت على وحدة تحكم التنقل في مكان ما في التسلسل الهرمي مما كان من المفترض أن تكون.

نصائح أخرى

الشيء الرئيسي الذي يجب وضعه في الاعتبار هنا هو أن وحدة التحكم في العرض ستعمل إطار عرضها نفسه. وذلك لأن مقدار المساحة المتاحة للعرض قد يتغير خلال عمر التطبيق ، ولا يعرف وحدة التحكم سوى طريقة العرض كيفية ضبط إطار العرض بشكل مناسب. تتضمن أمثلة عندما تتضمن تغييرات المساحة تغيير ارتفاع شريط التنقل ، وتحويل الجهاز من الصورة إلى المناظر الطبيعية ويمكن أن يزداد شريط الحالة أيضًا إذا قام المستخدم بإجراء مكالمة. ولهذا السبب ، يجب ألا تعدل إطار العرض بنفسك.

لذا ، فإن أول ما تحتاج إليه هو إزالة جميع التعليمات البرمجية المتعلقة بتعديل إطار العرض.

تحتاج الآن إلى تصميم وجهات نظرك مع العقلية التي يمكن أن يتغير حجم الإطار في أي لحظة. هذا يعني تعيين خاصية التنشيط التلقائي لكل عرض فرعي بشكل صحيح. إذا قمت بذلك ، فلن يهم إذا قمت بتشغيل قضبان التنقل والحالة المحاكاة أم لا ؛ إنهم فقط هناك لمساعدتك في معرفة شكل النتيجة النهائية في معظم الحالات.

يمكنك تعيين خاصية التنشيط التلقائي لكل عرض فرعي في Builder Interface في مفتش الحجم (واحد مع أيقونة المسطرة). في الرسوم المتحركة ، يمثل المربع الأبيض عرض الجذر لوحدة التحكم في العرض ، ويمثل المربع الأحمر العرض الفرعي المحدد حاليًا. ستلاحظ أن الرؤية الفرعية يتم تثبيتها إلى الزاوية العلوية اليسرى من عرض الجذر افتراضيًا. هذا جيد إذا لم يتغير حجم العرض أبدًا ، لكننا نعلم أنه ليس صحيحًا. إذا كان لديك آراء فرعية تريد أن تظهر في أسفل لا ، فأنت بحاجة إلى اللعب مع الرسم البياني على اليسار. الطريقة التي تعمل بها هي إذا تم تحديد أحد الخطوط الأربعة المحيطة بالحافة ، ثم يتم إصلاح المسافة بين حافة عرض الجذر وحافة الرؤية الفرعية. لذا ، إذا كنت تريد ظهور عرض فرعي في الأسفل ، فأنت بحاجة إلى التأكد من تحديد خط أسفل أكبر وليس الجزء العلوي. يؤثر الخطان في الوسط على ما إذا كان حجم الرؤية الفرعية يتغير عندما يتغير عرض الجذر. لذلك ، على سبيل المثال ، إذا كان لديك طريقة عرض جدول تريد أن تشغل ارتفاع الشاشة بالكامل ، فستتأكد من تحديد الخط العمودي الداخلي. وهذا ما يسمى نموذج الدعامات والينابيع.

إذا كنت تقوم بإضافة عمليات العرض الفرعية برمجيًا ، فأنت بحاجة إلى تعيين خاصية AutoresizationSk على كل عرض فرعي. هذا تفسير.

امل ان يساعد!

نص الارتباط

وتناقش خطأ مماثل هنا.

أيضا هل يتم تعيين الرسوم المتحركة إلى لا؟ حاول ضبطه على نعم لأن هذا حل مشكلة مماثلة كنت أواجهها.

كانت إجابة موشي مفيدة للغاية حيث أدركت أخيرًا معنى الخطوط المنقطة/الصلبة في IB للتحكم في خصائص تغيير الحجم لعناصر UIVIEW.

ومع ذلك ، فإن ضبط تلك الخصائص لم يعالج مشكلة مماثلة واجهتها مع إحدى وجهات نظري. كان لهذا المنظر حالة وشريط أعلى محدد في IB. لقد كانت ثقيلة قليلاً ، تحتوي على uiwebview من شأنها تحميل سلسلة HTML داخل viewWillAppear وعناصر الواجهة الأخرى.

أثناء تحميل العرض ، إذا غير المستخدم فجأة اتجاه الجهاز من الصورة إلى المناظر الطبيعية ، فإن جميع محتويات العرض ستتحول لأسفل على ارتفاع شريط الحالة. ستبقى الفجوة الناتجة بين عناصر التحكم في العرض وتجاوزها حتى بعد العودة إلى اتجاه الصورة.

ما حل مشاكلي أخيرًا ، وشعري المتبقي ، كان إضافة الخط:

    self.view.frame = [[UIScreen mainScreen] bounds];

داخل

-(void) willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration

منذ أن تم وضع محتويات رأيي في مكانها على الرغم من التغييرات المفاجئة في اتجاه الجهاز.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top