我们的应用程序在两个需要不同状态栏样式的屏幕之间转换时,将状态栏暂时隐藏作为动画的一部分。
我们有一个百分比驱动的动画过渡,当启动时,通过动画隐藏状态栏,完成后重新显示状态栏。
在iOS 11中,安全区域插图包括状态栏高度,这可能是可变的,并且当隐藏时,安全区域的顶部插图高度将下降到0高度。这会重新调整所有视图大小,导致可怕的跳跃。
尽管如此,我们仍然希望将我们的视图限制在安全区域内,因为我们正在尝试支持iPhone X。
当隐藏状态栏时,可以临时禁用对安全区域插图的更改吗?
我们的应用程序在两个需要不同状态栏样式的屏幕之间转换时,将状态栏暂时隐藏作为动画的一部分。
我们有一个百分比驱动的动画过渡,当启动时,通过动画隐藏状态栏,完成后重新显示状态栏。
在iOS 11中,安全区域插图包括状态栏高度,这可能是可变的,并且当隐藏时,安全区域的顶部插图高度将下降到0高度。这会重新调整所有视图大小,导致可怕的跳跃。
尽管如此,我们仍然希望将我们的视图限制在安全区域内,因为我们正在尝试支持iPhone X。
当隐藏状态栏时,可以临时禁用对安全区域插图的更改吗?
将约束设置为安全区域时,会受到状态栏以及视图在屏幕上的实际位置和变换的影响。如果您希望始终将顶部(或底部)安全区域高度应用于视图约束,则可以使用自定义约束来实现。
以下约束将自动将其 constant
值设置为设备顶部安全区域高度,不受状态栏或其他参数的影响。 要使用它,请将任何 约束的类更改为此类,并且它们的 constant
始终是安全区域高度。 请注意,在设备旋转时 ,它的值不会更改。
Objective-C
@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
Swift
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
}
}
}
safeAreaInsets.top
是0的? - LGPinitialViewController
上使用它,而在那时keyWindow
仍然是nil
。但是,我会点赞这个答案,因为它给了我一个解决我一直遇到的问题的想法,我将在下面的回答中概述。 - nsteinprefersStatusBarHidden
的覆盖都会被忽略,系统总是返回true
(参见此处)。viewDidLoad(_:)
中调整高度约束常量。
我没有看到丑陋的导航栏或视图控制器跳转。UIScrollView
,默认情况下会自动进行调整。请参见contentInsetAdjustmentBehavior
。
additionalSafeAreaInsets
)是唯一对我有效的。你不需要去管 UIApplication 或者其他的东西! - aheze