يعمل نظام iOS 11 لتخطيط المناطق الآمنة على توجيه التوافق مع الإصدارات السابقة




xcode compatibility (9)

هل تمكين إرشادات تخطيط منطقة آمنة متوافق مع نظام التشغيل iOS أقل من 11؟


"دليل تخطيط المنطقة الآمنة" متوافق مع الإصدارات السابقة. حسنًا ، ما لم تستخدمه في xib. مع القصة المصورة يبدو موافق.

لقد تمكنت من حل مشكلتي من خلال الوصول إلى "قيد التصميم العلوي" من الكائن الأول في الجزء العلوي من العرض الخاص بي.

@property (weak, nonatomic) IBOutlet NSLayoutConstraint *topLayoutConstraint;

بعد ذلك ، قمت بتغيير القيمة "ثابت" إلى هذا القيد وقم بتحديث العرض. على سبيل المثال ، إذا كنت تستخدم شريط تنقل (ارتفاع 44) بالإضافة إلى شريط الحالة (ارتفاع 20):

if (SYSTEM_VERSION_LESS_THAN(@"11.0")) {
    _topLayoutConstraint.constant = 64;
    [self.view layoutIfNeeded];
}

باستخدام SYSTEM_VERSION_LESS_THAN المعرّف على هذا النحو:

#define SYSTEM_VERSION_LESS_THAN(v) ([[[UIDevice currentDevice] systemVersion] compare:v options:NSNumericSearch] == NSOrderedAscending)

أواجه مشكلات التوافق مع WKWebView & Safe Area على نظام التشغيل iOS 9. لسبب ما ، يتجاهل WKWebView ببساطة إعدادات تخطيط المنطقة الآمنة.


إليك ما فعلته بمشاريعي

في حالتي ، فإن كلا من topConstraint و bottomConstraint s هما @IBOutlet . هذا متوافق أيضًا مع iOS 8 .

التهيئة الأولية للقيود العلوية والسفلية مخصصة لأجهزة iPhone العادية ، ولهذا السبب أنا فقط أقوم بتحرير القيود المفروضة على iPhone X

    // iOS 11 Layout Fix. (For iPhone X)
    if #available(iOS 11, *) {
        self.topConstraint.constant = self.topConstraint.constant + self.view.safeAreaInsets.top

        self.bottomConstraint.constant = self.bottomConstraint.constant + self.view.safeAreaInsets.bottom
    }

.

ملاحظة: self.view هو self.view الخاص بك وهذا هو السبب في أنني safeAreaInsets لـ safeAreaInsets


تمكنت من العمل مع أدلة تخطيط Safe Area الجديدة والحفاظ على التوافق مع الإصدارات السابقة مع iOS 9 و iOS 10: (EDIT: كما هو موضح في التعليقات التي كتبهاNickEntin ، فإن هذا التطبيق سوف يفترض وجود شريط الحالة ، والذي لن كن حقيقيًا في المناظر الطبيعية على iPhone X. مما يؤدي إلى وجود مساحة كبيرة في المقدمة (20 نقطة).

على سبيل المثال ، إذا كنت تريد أن تكون طريقة العرض أقل بـ 10 نقاط أسفل شريط الحالة (و 10 نقاط أسفل غطاء المستشعر على iPhone X):

  1. في XIB ، انتقل إلى File Inspector وقم بتمكين الخزنة من خلال Use Safe Area Layout Guides .
  2. قم بإنشاء قيد من أعلى طريقة العرض إلى أعلى طريقة العرض الرئيسية ، مع القيد >= (أكبر من أو يساوي) ، ثابت 30 (30 لأننا نريد تباعد 10 نقاط على شريط الحالة أعلى من 20 نقطة) وأولوية High (750) .
  3. أنشئ قيدًا من أعلى العرض إلى أعلى Safe Area ، مع قيد = (يساوي) ، ثابت 10 وأولوية Low (250).

يمكن القيام بالشيء نفسه لعرضه في الجزء السفلي (وللقيادة / السحب أو اليسار / اليمين إلى المنطقة الآمنة):

  1. في XIB ، انتقل إلى File Inspector وقم بتمكين الخزنة من خلال Use Safe Area Layout Guides .
  2. قم بإنشاء قيد من أسفل طريقة العرض إلى أسفل طريقة العرض الرئيسية ، باستخدام >= (أكبر من أو يساوي) قيد ، ثابت 10 وأولوية High (750).
  3. قم بإنشاء قيد من أسفل العرض إلى أسفل منطقة الأمان ، مع قيد = (يساوي) ، ثابت 10 وأولوية Low (250).

في الهدف- C للهامش العلوي والسفلي عند استخدام iPhone-X

if (@available(iOS 11, *)) {

    NSLayoutConstraint *bottomConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                              attribute:NSLayoutAttributeBottom
                                                                              relatedBy:NSLayoutRelationEqual
                                                                                 toItem:self.parentView.safeAreaLayoutGuide
                                                                              attribute:NSLayoutAttributeBottom
                                                                             multiplier:1.0
                                                                               constant:0];


    NSLayoutConstraint *topConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                       attribute:NSLayoutAttributeTop
                                                                       relatedBy:NSLayoutRelationEqual
                                                                          toItem:self.parentView.safeAreaLayoutGuide
                                                                       attribute:NSLayoutAttributeTop
                                                                      multiplier:1.0
                                                                        constant:0];


} else {

    NSLayoutConstraint *bottomConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                          attribute:NSLayoutAttributeBottom
                                                                          relatedBy:NSLayoutRelationEqual
                                                                             toItem:self.parentView
                                                                          attribute:NSLayoutAttributeBottom
                                                                         multiplier:1.0
                                                                           constant:0];


    NSLayoutConstraint *topConstraint   = [NSLayoutConstraint constraintWithItem:self.childView
                                                                       attribute:NSLayoutAttributeTop
                                                                       relatedBy:NSLayoutRelationEqual
                                                                          toItem:self.parentView
                                                                       attribute:NSLayoutAttributeTop
                                                                      multiplier:1.0
                                                                        constant:0];

}

كنت أستخدم هذا في Objective-C مع نتيجة جيدة لنظام iOS 10. في حال كنت تستخدم SafeArea في xib الخاص بك ، يمكنك إضافة في viewDidLoad الخاص بك:

if (@available(iOS 11.0, *)) {}
else {
    self.edgesForExtendedLayout = UIRectEdgeNone;
}

من المؤكد أن هناك مشكلة توافق واحدة على الأقل مع القيود المفروضة على منطقة iOS 11 الآمنة والتي لاحظتها في Xcode 9 GM - أدوات التحكم في المشاهدة مع الضغط على المنطقة الآمنة.

إذا كان شريط التنقل مخفيًا وكنت تدفع عرضًا مقيدًا أعلى منطقة آمنة ، فسوف يتداخل عرض الضغط مع شريط الحالة في iOS 9 و 10.

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

في نظام التشغيل iOS 11 ، سيكون التصميم صحيحًا في كلتا الحالتين.

إليك مثال بسيط: http://www.filedropper.com/foobar

وإليك شريط فيديو منه مع شريط التنقل مخفي (iOS 10.3 على اليسار ، iOS 11 على اليمين): https://vimeo.com/234174841/1e27a96a87

إليك إصدار يظهر فيه شريط التنقل (مُمكّن في بنك الاستثمار القومي): https://vimeo.com/234316256/f022132d57

قدمت هذا باسم الرادار # 34477706.

بفضل @Sander حالة شريط التنقل المرئية.


نعم ، سيعمل مشروعك / تطبيقك في إصدارات iOS قبل iOS 11 دون أي مشكلة. في إصدارات iOS قبل 11 ، يستبدل / يعتبر Safe Area Layout في AutoLayout العادي ويتبع دليل تخطيط قواعد و أسفل.

لقد اختبرت مشروعي الحالي مع وبدون "SafeAreaLayout" على كلا النظامين (iOS 11 و iOS 10 المتخلفين). انها تعمل بشكل جيد.

فقط تأكد:

  • إذا كنت قد صممت مشروعك / واجهة المستخدم في AutoLayout ؛ تتبع قيود UIElement الخاصة بك / نسبة إلى دليل التصميم العلوي والسفلي (وليس المشاهدة الفائقة). لذلك بنقرة واحدة (تمكين) على خيار SafeAreaLayout ، ستنفذ تلقائيًا تخطيط SafeArea بشكل صحيح لجميع ملفات Interface Builders في لوحة العمل.

  • إذا كنت قد صممت مشروعك / واجهة المستخدم في SafeAreaLayout ؛ بعد ذلك سوف يتبع تلقائيًا دليل تخطيط Top and السفلي في نظام التشغيل iOS الخلفي.

فيما يلي نموذج لقطة مع النتيجة ، من خلال تمكين أو تعطيل تخطيط Safe Area ، لن يؤثر على التصميم الحالي.

تخطيط منطقة آمنة:

التخطيط التلقائي

باختصار ، الإجابة على سؤالك هي: "تمكين أدلة تخطيط المناطق الآمنة المتوافقة مع نظام التشغيل iOS قبل 11"

يمكنك تطبيق Safe Area Layout في مشروعك / تطبيقك وسيعمل بشكل جيد مع إصدارات iOS السابقة عن طريق تحويل Safe Area Layout إلى Top و Bottom Layout.


هنا هو بلدي حل دائرة الرقابة الداخلية 9 إلى نظام التشغيل iOS 11+ في سريع 4+

    let safeAreaTopAnchor:NSLayoutYAxisAnchor?
    if #available(iOS 11.0, *) {
        safeAreaTopAnchor = contentView.safeAreaLayoutGuide.topAnchor
    } else {
        // Fallback on earlier versions

        var parentViewController: UIViewController? {
            var parentVCResponder: UIResponder? = self
            while parentVCResponder != nil {
                parentVCResponder = parentVCResponder!.next
                if let viewController = parentVCResponder as? UIViewController {
                    return viewController
                }
            }
            return nil
        }

        safeAreaTopAnchor = parentViewController?.topLayoutGuide.bottomAnchor

    }




safearealayoutguide