adr*_*hen 131 iphone uitabbar ios11 xcode9-beta iphone-x
任何人在UITabBar组件周围遇到iPhone X模拟器问题?
我似乎将图标和标题呈现在彼此之上,我不确定我是否遗漏了任何东西,我也在iPhone 8模拟器中运行它,以及一个看起来很好的实际设备,如图所示故事板.
iPhone X:
iPhone 8
小智 40
我只需在viewDidLayoutSubviews中的UITabBar上调用invalidateIntrinsicContentSize就可以解决这个问题.
-(void)viewDidLayoutSubviews
{
[super viewDidLayoutSubviews];
[self.tabBar invalidateIntrinsicContentSize];
}
Run Code Online (Sandbox Code Playgroud)
注意:标签栏的底部需要包含在主视图的底部,而不是安全区域,并且标签栏应该没有高度约束.
Rai*_*kas 24
VoidLess提供的答案仅部分修复了TabBar问题.它修复了tabbar中的布局问题,但是如果你使用隐藏tabbar的viewcontroller,那么tabbar在动画期间会被错误地呈现(要重现它最好有2个segues - 一个模态和一个push.如果你交替segues,你可以看到标签栏被渲染出来了.下面的代码解决了这两个问题.好苹果.
class SafeAreaFixTabBar: UITabBar {
var oldSafeAreaInsets = UIEdgeInsets.zero
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if oldSafeAreaInsets != safeAreaInsets {
oldSafeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 11.0, *) {
let bottomInset = safeAreaInsets.bottom
if bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90) {
size.height += bottomInset
}
}
return size
}
override var frame: CGRect {
get {
return super.frame
}
set {
var tmp = newValue
if let superview = superview, tmp.maxY !=
superview.frame.height {
tmp.origin.y = superview.frame.height - tmp.height
}
super.frame = tmp
}
}
}
Run Code Online (Sandbox Code Playgroud)
Objective-C代码:
@implementation VSTabBarFix {
UIEdgeInsets oldSafeAreaInsets;
}
- (void)awakeFromNib {
[super awakeFromNib];
oldSafeAreaInsets = UIEdgeInsetsZero;
}
- (void)safeAreaInsetsDidChange {
[super safeAreaInsetsDidChange];
if (!UIEdgeInsetsEqualToEdgeInsets(oldSafeAreaInsets, self.safeAreaInsets)) {
[self invalidateIntrinsicContentSize];
if (self.superview) {
[self.superview setNeedsLayout];
[self.superview layoutSubviews];
}
}
}
- (CGSize)sizeThatFits:(CGSize)size {
size = [super sizeThatFits:size];
if (@available(iOS 11.0, *)) {
float bottomInset = self.safeAreaInsets.bottom;
if (bottomInset > 0 && size.height < 50 && (size.height + bottomInset < 90)) {
size.height += bottomInset;
}
}
return size;
}
- (void)setFrame:(CGRect)frame {
if (self.superview) {
if (frame.origin.y + frame.size.height != self.superview.frame.size.height) {
frame.origin.y = self.superview.frame.size.height - frame.size.height;
}
}
[super setFrame:frame];
}
@end
Run Code Online (Sandbox Code Playgroud)
Cru*_*ruz 15
覆盖UITabBar
sizeThatFits(_)
safeArea
extension UITabBar {
static let height: CGFloat = 49.0
override open func sizeThatFits(_ size: CGSize) -> CGSize {
guard let window = UIApplication.shared.keyWindow else {
return super.sizeThatFits(size)
}
var sizeThatFits = super.sizeThatFits(size)
if #available(iOS 11.0, *) {
sizeThatFits.height = UITabBar.height + window.safeAreaInsets.bottom
} else {
sizeThatFits.height = UITabBar.height
}
return sizeThatFits
}
}
Run Code Online (Sandbox Code Playgroud)
aaa*_*jaa 10
我将此添加到viewWillAppear
我的自定义中UITabBarController
,因为所提供的答案都不适用于我:
tabBar.invalidateIntrinsicContentSize()
tabBar.superview?.setNeedsLayout()
tabBar.superview?.layoutSubviews()
Run Code Online (Sandbox Code Playgroud)
我有同样的问题.
如果我在UITabBar的底部约束上将任何非零常量设置为安全区域:
它按预期开始工作......
这是我做出的唯一改变,我不知道为什么会有效,但如果有的话,我很想知道.
小智 5
通过使用子类UITabBar来应用safeAreaInsets:
class SafeAreaFixTabBar: UITabBar {
var oldSafeAreaInsets = UIEdgeInsets.zero
@available(iOS 11.0, *)
override func safeAreaInsetsDidChange() {
super.safeAreaInsetsDidChange()
if oldSafeAreaInsets != safeAreaInsets {
oldSafeAreaInsets = safeAreaInsets
invalidateIntrinsicContentSize()
superview?.setNeedsLayout()
superview?.layoutSubviews()
}
}
override func sizeThatFits(_ size: CGSize) -> CGSize {
var size = super.sizeThatFits(size)
if #available(iOS 11.0, *) {
let bottomInset = safeAreaInsets.bottom
if bottomInset > 0 && size.height < 50 {
size.height += bottomInset
}
}
return size
}
}
Run Code Online (Sandbox Code Playgroud)
经过几个小时诅咒苹果后,我终于想到了这一点.
UIKit实际上确实为您处理了这个问题,并且看起来移位的标签栏项目是由于不正确的设置(可能是实际的UIKit错误).不需要子类化或背景视图.
它甚至可以在Interface builder中使用.
真正愚蠢的是,即使你在上面的步骤中添加IB添加的确切约束,你也可以在IB中明确地看到错误!
UITabBar 的高度增加到主页按钮/线上方,但在其原始位置绘制子视图并将 UITabBarItem 覆盖在子视图上。
作为解决方法,您可以检测 iPhone X,然后将视图高度缩小 32px,以确保选项卡栏显示在主线上方的安全区域中。
例如,如果您正在以编程方式创建 TabBar,请替换
self.tabBarController = [[UITabBarController alloc] init];
self.window.rootViewController = self.tabBarController;
Run Code Online (Sandbox Code Playgroud)
有了这个:
#define IS_IPHONEX (([[UIScreen mainScreen] bounds].size.height-812)?NO:YES)
self.tabBarController = [[UITabBarController alloc] init];
self.window.rootViewController = [[UIViewController alloc] init] ;
if(IS_IPHONEX)
self.window.rootViewController.view.frame = CGRectMake(self.window.rootViewController.view.frame.origin.x, self.window.rootViewController.view.frame.origin.y, self.window.rootViewController.view.frame.size.width, self.window.rootViewController.view.frame.size.height + 32) ;
[self.window.rootViewController.view addSubview:self.tabBarController.view];
self.tabBarController.tabBar.barTintColor = [UIColor colorWithWhite:0.98 alpha:1.0] ;
self.window.rootViewController.view.backgroundColor = [UIColor colorWithWhite:0.98 alpha:1.0] ;
Run Code Online (Sandbox Code Playgroud)
注意:这很可能是一个错误,因为视图大小和选项卡栏布局是由操作系统设置的。它可能应该按照 Apple 在 iPhone X 人机界面指南中的屏幕截图显示:https ://developer.apple.com/ios/ human-interface-guidelines/overview/iphone-x/
归档时间: |
|
查看次数: |
28884 次 |
最近记录: |