61
задан 23 October 2019 в 20:07

3 ответа

Быстро 5

я просто делаю это. Это просто, и очень близко к реальной вещи (просто добавил 'r').

extension UIView {
var saferAreaLayoutGuide: UILayoutGuide {
    get {
        if #available(iOS 11.0, *) {
            return self.safeAreaLayoutGuide
        } else {
            return self.layoutMarginsGuide
        }
    }
}

Использование как это:

button.topAnchor.constraint(equalTo: view.saferAreaLayoutGuide.topAnchor, constant: 16)
0
ответ дан 31 October 2019 в 15:17

для iOS 9:

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    self.navigationController.navigationBar.translucent = NO;
}

, если Вы включаете авторасположение и добавляете ограничения представления к [1 113] безопасная область , Вы хороши для выхода за предел iOS 11 + , но это не может работать хорошо с [1 115], iOS 9 и представление могут появиться под Вашим панель навигации . Для решения этой проблемы можно отключить полупрозрачный атрибут в [1 118]' viewWillAppear: (BOOL) анимировал ' метод.

К не повредить предыдущее состояние [1 119] полупрозрачный атрибут Вашего панель навигации , необходимо сохранить предыдущее значение и сбросить его в [1 121]' viewWillDisappear: (BOOL) анимировал '

@interface YourViewController ()
@property (nonatomic, assign) BOOL translucentState;
@end

- (void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];

    self.translucentState = self.navigationController.navigationBar.translucent;
    self.navigationController.navigationBar.translucent = NO;
}

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];

    self.navigationController.navigationBar.translucent = self.translucentState;
}

P.S. , не должен использовать edgesForExtendedLayout с выполнением этого:

self.edgesForExtendedLayout = UIRectEdgeNone;

Выезд документация Apple: https://developer.apple.com/documentation/uikit/uiviewcontroller/1621515-edgesforextendedlayout

1
ответ дан 31 October 2019 в 15:17

Вот мой iOS 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

    }
1
ответ дан 31 October 2019 в 15:17