La réponse fournie par VoidLess ne résout que partiellement les problèmes de la barre de tabulation. Il corrige les problèmes de mise en page dans la barre d'onglets, mais si vous utilisez un viewcontroller qui cache la barre d'onglets, celle-ci est rendue de manière incorrecte pendant les animations (pour la reproduire, il est préférable d'avoir 2 séquences - une modale et une push. Si vous alternez les séquences, vous pouvez voir que la barre d'onglets n'est pas rendue à sa place). Le code ci-dessous résout les deux problèmes. Bon travail Apple.
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
}
}
}
Code 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
1 votes
Problème similaire : l'indicateur de sélection de la vue image s'enfonce dans la vue tabBar d'environ 16 points dans l'iPhone X.
0 votes
FYI - ceci n'est malheureusement pas corrigé dans Xcode 9.2beta
0 votes
C'est un bug d'uikit qui existe toujours. Les contraintes doivent être configurées correctement. Voir ma réponse ci-dessous !
0 votes
J'ai eu des problèmes de ce genre Vérifiez cette réponse stackoverflow.com/a/53524635/5441253