隐藏状态栏iOS 11时,安全区域插入更改

Dav*_*ees 8 ios

在我们的应用程序中,我们暂时隐藏状态栏作为动画的一部分,在两个需要不同状态栏样式的屏幕之间进行转换.

我们有一个百分比驱动的动画过渡,在启动时,用动画隐藏状态栏,完成时显示状态栏.

在iOS 11上,安全区域插入包括可变的状态栏高度,当隐藏时,安全区域的顶部插入下降到0高度.这会重新调整我们的所有视图,并且在视图大小之间会出现可怕的跳跃.

我们仍然希望将我们的观点限制在安全区域,因为我们正在努力支持iPhone X.

隐藏状态栏时,我们可以暂时禁用对安全区域insets的更改吗?

LGP*_*LGP 7

设置为的约束safe area受状态栏以及视图在屏幕上的实际位置及其转换的影响。如果您始终只想对视图约束应用顶部(或底部)安全区域高度,则可以改用自定义约束。

以下约束将自动将其constant值设置为设备顶部安全区域高度的高度,不受状态栏或其他参数的影响。要使用它,请将任何约束的类更改为此,它们constant将始终是安全区域的高度。请注意,旋转设备时不会更改其值。

对象

@interface TopSafeAreaContraint : NSLayoutConstraint

@end

@implementation TopSafeAreaContraint

- (void)awakeFromNib {
    [super awakeFromNib];

    if (@available(iOS 11.0, *)) {
        UIEdgeInsets insets = [UIApplication sharedApplication].keyWindow.safeAreaInsets;
        self.constant = MAX(insets.top, 20.0);
    } else {
        // Pre-iOS 11.0
        self.constant = 20.0;
    }
}

@end
Run Code Online (Sandbox Code Playgroud)

迅速

class TopSafeAreaConstraint: NSLayoutConstraint {
    override func awakeFromNib() {
        super.awakeFromNib()
        if #available(iOS 11.0, *) {
            let insets = UIApplication.shared.keyWindow?.safeAreaInsets ?? .zero
            self.constant = max(insets.top, 20)
        } else {
            // Pre-iOS 11.0
            self.constant = 20.0
        }
    }
}
Run Code Online (Sandbox Code Playgroud)