UinavigationBar التلقائي
-
30-09-2019 - |
سؤال
في تطبيقي ، حصلت على uinavigationController. لسوء الحظ ، عندما أقوم بتدوير الجهاز ويتغير اتجاه الواجهة ، لا يغير uinavigationBar ارتفاعه. في تطبيقات iPhone الأخرى ، مثل Contacts.App ، يصبح شريط التنقل أقل قليلاً في وضع المناظر الطبيعية. يجب أن تكون مدمجة ، لأنه إذا أخذت تطبيق نموذج التنقل من قائمة Xcode وأضف اتجاه الواجهة إليه ، فإنه يغير ارتفاع شريط التنقل بشكل صحيح.
كيف يمكنني تغيير حجم شريط التنقل كما هو الحال في جميع تطبيقات iPhone الأخرى التي رأيتها؟
المحلول
لقد أجريت القليل من الاختبار ، وعلى الرغم من أنني لا أحب الطريقة ، إلا أنه من السهل جدًا القيام به.
بعد أن بحثت عن طريقة خاصة ربما نجحت ، لم أتمكن من العثور على طريقة. كل ما وجدته هو:
@property BOOL forceFullHeightInLandscape;
- (BOOL)isMinibar;
لا يوجد جهاز -isMinibar
, ، لذلك لا يمكننا ضبط ذلك. أعتقد أنه يعيد قيمة بناءً على ارتفاعها. ايضا، forceFullHeightInLandscape
تم تعيينه إلى NO
, ومع ذلك ، فإنه لا يزال لم يعدل ارتفاعه.
أثناء تغيير autoresizingMask
لكي يتضمن UIViewAutoresizingFlexibleHeight
, ، المنظر فعلت تغيير الحجم لتكون أصغر ، لكنها الآن كانت صغيرة جدًا. لكن، -isMinibar
عاد فجأة YES
. هذا جعلني أفكر فقط في ترك الرأي تغيير حجم نفسه ، وضبطه على الارتفاع الصحيح.
لذلك نذهب هناك ، طريقة تعمل ، حتى بدون مكالمات API الخاصة:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar performSelector:@selector(sizeToFit) withObject:nil afterDelay:(0.5f * duration)];
}
شيء واحد يجب أن تتعامل معه هو أن المشاهدات الموجودة أسفل الشريط لن يتم ضبطها على الشريط الأصغر ، بحيث تكون هناك فجوة بين الشريط والمشاهد أدناه. أسهل طريقة لحل هذا هو إضافة عرض حاوية ، تمامًا مثل الحالة مع أ UINavigationController
. كنت ستأتي بشيء مثل:
- (void)willRotateToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self performSelector:@selector(resizeViewsForNavigationBar) withObject:nil afterDelay:(0.5f * duration)];
}
- (void)resizeViewsForNavigationBar {
[self.navigationBar sizeToFit];
// Resize containerView accordingly.
CGRect containerViewRect = self.containerView.frame;
containerViewRect.origin.y = CGRectGetMaxY(self.navigationBar.frame);
containerViewRect.size.height = CGRectGetMaxY(self.view.frame) - containerViewRect.origin.y;
self.containerView.frame = containerViewRect;
}
نصائح أخرى
أعتقد أن السلوك الذي تريده يحدث فقط عندما يتم إضافة وحدة تحكم التنقل (التي تمثل القضبان (التنقل أو شريط الأدوات)) ، إلى النافذة في مندوب التطبيق أو تقديمه بواسطة شريط علامات تبويب ، إلخ.
يمكنك إضافة شريط تنقل عبر IB أو الرمز ، فهذا لا يعني أن لديك وحدة تحكم التنقل. رأيي هو ، إنشاء وحدة تحكم التنقل وتهيئته باستخدام وحدة التحكم في العرض التي تعمل فيها. ربما عندما تدور العرض ، سيتقلص شريط NAV قليلاً ، بالطريقة التي تريدها.
أتمنى أن يساعدك هذا
شكرا لجوست لقد أضفت
@property BOOL forceFullHeightInLandscape;
إلى فئة uinavigationbar المخصصة الخاصة بي. وضبط في:
-(id)initWithFrame:(CGRect)frame{
forceFullHeightInLandscape = YES;
عملت مثل السحر
على غرار إجابة يوست ، ولكن وضع الطريقة في willAnimateRotationToInterfaceOrientation
له تأثير على الرسوم المتحركة أفضل من willRotateToInterfaceOrientation
. (لا يوجد تأخير للرسوم المتحركة)
- (void)willAnimateRotationToInterfaceOrientation:(UIInterfaceOrientation)toInterfaceOrientation duration:(NSTimeInterval)duration {
[self.navigationBar sizeToFit];
}
لقد تعرضت لهذا الخطأ أيضًا ، وعلى الرغم من أنه من المحتمل أن يكون السبب في نفس السبب ، أود نشره هنا لمساعدة أي شخص آخر على الأبله.
إذا كنت تتجاوز أي willRotateToInterface
طُرق، تذكر الاتصال super
لقد فُزمت على ذلك ، لكن بمجرد أن رأيت الإجابة المقبولة ، جاءت لي.
أعتقد أن هذا يشبهك نوعًا ما ولديهم مقتطف الرمز:
لقد جربت بعض الأشياء فقط داخل Builder و Xcode وطالما كنت تستخدم UINavigationBarController
كما RootViewController
إنه يعمل كما هو موضح - يصبح أصغر. هل قمت بتغيير أي أشياء داخل وحدة التحكم نفسها أو في أجزاء من كيفية تحميل وحدة التحكم؟ خاصة فيما يتعلق بإطلاق الأحداث؟ كان لدي بعض الصلاحية السيئة مع UITabBarController
من حيث كسر المراسلة المناسبة وحصلت على بعض الآثار الجانبية "المنطقية". مجرد محاولة وتخمين.
(void)viewWillLayoutSubviews {
self.navigationItem.titleView.bounds = self.navigationController.navigationBar.bounds;
}