Icônes et titres UITabBar du simulateur iOS 11 iPhone X rendus sur le dessus se recouvrant

134

Quelqu'un a-t-il un problème avec le simulateur iPhone X autour du composant UITabBar?

Le mien semble rendre les icônes et le titre les uns sur les autres, je ne suis pas sûr s'il me manque quelque chose, je l'ai également exécuté dans le simulateur de l'iPhone 8, et sur un appareil réel où ça a l'air bien, comme indiqué sur le planche d'histoire.

iPhone X:

Bogue UITabBar de l'iPhone X

iPhone 8

iPhone 8 UITabBar fonctionne

Adrian Chen
la source
1
Mon problème similaire: la vue de l'image de l'indicateur de sélection s'enfonce dans la vue tabBar d'environ 16 points dans l'iPhone X.
Itachi
Pour info - ce n'est malheureusement pas corrigé dans Xcode 9.2beta
tdios
C'est un bogue uikit qui existe toujours. Les contraintes doivent être mises en place correctement. Voir ma réponse ci-dessous!
RyanM
J'ai eu des problèmes comme celui-là Vérifiez cette réponse stackoverflow.com/a/53524635/5441253
Maxime Ashurov

Réponses:

40

J'ai pu contourner le problème en appelant simplement invalidateIntrinsicContentSize sur UITabBar dans viewDidLayoutSubviews.

-(void)viewDidLayoutSubviews
{
    [super viewDidLayoutSubviews];
    [self.tabBar invalidateIntrinsicContentSize];
}

Remarque: Le bas de la barre d'onglets devra être contenu au bas de la vue principale, plutôt que dans la zone de sécurité, et la barre d'onglets ne doit avoir aucune contrainte de hauteur.

David Hooper
la source
J'ai une barre d'onglets sans contrainte de hauteur, limitée au guide de mise en page inférieur, et cela n'a pas fonctionné pour moi. D'autres idées?
Kenny Wyland
1
Ne fonctionne pas lorsque homeVC présente VC A, puis rejetez A et poussez VC B depuis homeVC. Ceci est une solution de contournement stackoverflow.com/a/47225653/1553324
ooops
1
L'ajout de cette méthode combinée à l'épinglage de la barre d'onglets au bas de sa supervision ( pas la zone de sécurité) a fonctionné pour moi.
Drew C
3
J'avais également besoin d'ajouter [self.view layoutIfNeeded].
Iulian Onofrei
1
Cela fonctionne mais j'ai appris que je dois aussi faire attention à la taille des images dans les boutons de la barre d'onglets. En mode paysage (sur les appareils compacts, mais pas sur les modèles iPad et iPhone Plus), le système utilise une barre d'onglets compacte qui est censée avoir des images plus petites que vous pouvez définir avec la landscapeImagepropriété du bouton de la barre d'onglets. Les tailles recommandées sont dans [Apple HIG's] ( developer.apple.com/design/human-interface-guidelines/ios/… ) sous Taille d'icône personnalisée
RobP
25

La réponse fournie par VoidLess ne corrige que partiellement les problèmes de TabBar. Il corrige les problèmes de mise en page dans la barre d'onglets, mais si vous utilisez viewcontroller qui masque la barre d'onglets, la barre d'onglets est rendue de manière incorrecte pendant les animations (pour la reproduire, il est préférable d'avoir 2 segues - une modale et une poussée. Si vous alternez les segues, vous pouvez voir la barre d'onglets rendue déplacée). Le code ci-dessous résout les deux problèmes. Bon travail de pomme.

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
Raimundas Sakalauskas
la source
Solution complète. Merci.
Sayalee Pote
4
Merci pour votre réponse. Mais comment l'utilisez-vous dans une classe UITabBarController?
Jojo
2
@Jojo, étant donné la quantité de code nécessaire pour remplir la barre d'onglets via le code, je crée toujours uitabbarcontroller à l'aide de storyboards. Là, vous pouvez attribuer une classe personnalisée pour la barre d'onglets. J'espère que cela t'aides.
Raimundas Sakalauskas
ce problème ne se produit pas sur un appareil réel.J'ai testé cela sur iPhone11 pro iOS 13
Akshay Jadhav
22

Il existe une astuce par laquelle nous pouvons résoudre le problème.

Mettez simplement votre UITabBar dans un UIView.

Cela fonctionne vraiment pour moi.

Ou vous pouvez suivre ce lien pour plus de détails.

Avineet Gupta
la source
3
Cela a bien fonctionné, ayez un uiview qui contient simplement l'UITabBar. Placez les contraintes sur les zones sûres de l'UIView (L, R et Bottom), donnez-lui une hauteur (49) et contraignez l'UITabBar à l'UIView de tous les côtés.
sdsykes
1
Cette solution a fonctionné pour moi. Je n'utilisais pas un UITabController, juste UITabBar.
Riccardo Tesio
1
A travaillé pour moi. Merci
francis lanthier
1
Cela m'a aidé! Je vous remercie!
Glenn
2
Cela fonctionne mais la zone "non sécurisée" peut ne pas être de la même couleur que la barre d'onglets (au cas où la super vue et la barre d'onglets ne seraient pas de la même couleur)
iDev
16

remplacement UITabBar sizeThatFits(_)pour 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
    }
}
Cruz
la source
Brillant. Je viens de définir la taille personnalisée de ma barre d'onglets et je me demande pourquoi cela ne fonctionne pas sur iPhoneX. Les autres solutions ne fonctionnent pas pour moi car j'utilise le contrôleur de la barre d'onglets et cela n'inclut pas de contraintes.
Jindřich Rohlík
12

J'ai ajouté ceci à viewWillAppearma coutume UITabBarController, car aucune des réponses fournies n'a fonctionné pour moi:

tabBar.invalidateIntrinsicContentSize()
tabBar.superview?.setNeedsLayout()
tabBar.superview?.layoutSubviews()
aaannjjaa
la source
1
Cela m'a aidé à résoudre un problème lié au déplacement de la tabBar en haut de l'écran. Je vous remercie!
Jay
Mais pas pour moi :(
Nick
9

J'ai eu le même problème.

entrez la description de l'image ici

Si je place une constante non nulle sur la contrainte inférieure de l'UITabBar à la zone de sécurité:

entrez la description de l'image ici

Cela commence à fonctionner comme prévu ...

entrez la description de l'image ici

C'est le seul changement que j'ai fait et je ne sais pas pourquoi cela fonctionne, mais si quelqu'un le fait, j'aimerais le savoir.

moliveira
la source
1
C'est ce que j'ai fait à la fin pour le faire fonctionner, mais oui, je ne sais pas pourquoi ni ne comprends ce que cela fait. Pour moi, cela ressemble toujours à un bug
adrian chen
7

Déplacer la barre d'onglets à 1 point du bas a fonctionné pour moi.

Bien sûr, vous obtiendrez un vide en le faisant que vous devrez combler d'une manière ou d'une autre, mais le texte / les icônes sont maintenant correctement positionnés.

deej
la source
7

Ah! C'est en fait magique!

J'ai finalement compris cela après des heures à maudire Apple.

UIKit gère cela pour vous, et il semble que les éléments de la barre d'onglets décalés soient dus à une configuration incorrecte (et probablement à un bogue UIKit réel). Il n'y a pas besoin de sous-classification ou de vue d'arrière-plan.

UITabBar "fonctionnera simplement" s'il est contraint au bas du superview, PAS à la zone de sécurité inférieure .

Cela fonctionne même dans le constructeur d'interface.

Configuration correcte

Travailler à l'IB

  1. Dans le générateur d'interface, sous forme d'iPhone X, faites glisser un UITabBar là où il s'aligne sur la zone de sécurité inférieure. Lorsque vous le déposez, il doit avoir l'air correct (remplissez l'espace jusqu'au bord inférieur).
  2. Vous pouvez alors faire un "Ajouter des contraintes manquantes" et IB ajoutera les bonnes contraintes et votre barre d'onglets fonctionnera comme par magie sur tous les iPhones! (Notez que la contrainte du bas semble avoir une valeur constante égale à la hauteur de la zone non sécurisée de l'iPhone X, mais la constante est en fait 0)

Parfois ça ne marche toujours pas

Cassé dans IB

Ce qui est vraiment stupide, c'est que vous pouvez également voir le bogue dans IB, même si vous ajoutez les contraintes exactes qu'IB ajoute dans les étapes ci-dessus!

  1. Faites glisser un UITabBar et ne l'alignez pas sur l'encart de la zone de sécurité inférieure
  2. Ajouter des contraintes de début, de fin et de fond à superview (zone non sûre) Bizarrement, cela se corrigera si vous faites un "Inverser le premier et le deuxième élément" dans l'inspecteur de contraintes pour la contrainte du bas. ¯_ (ツ) _ / ¯
RyanM
la source
changé toutes les contraintes de la zone sûre à superview et travaillé. Legend Ryan
RyanTCB
6

Corrigé en utilisant UITabBar sous-classé pour appliquer 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
    }
}
VoidLess
la source
Résout une partie des problèmes, mais pas tous. S'il vous plaît voir la réponse complète ci
Raimundas Sakalauskas
Cela a fonctionné pour moi quand j'essaie de présenter VCA, puis de rejeter VCA, de pousser VCB.
Tai Le
Cela fonctionne pour moi, mais je dois mettre la contrainte inférieure sur la vue supervisée et non sur la zone de sécurité.
yajra
Que dois-je faire avec cette nouvelle classe après l'avoir créée? J'ai essayé de rechercher dans mon application toute occurrence de UITabBar et de les remplacer par SafeAreaFixTabBar ... J'ai trouvé ces occurrences: func application (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {SafeAreaFixTabBar. () .barTintColor = ... SafeAreaFixTabBar.appearance (). backgroundColor = ... SafeAreaFixTabBar.appearance (). tintColor = ... Mais n'a rien
corrigé
4

Résolu pour moi en appelant [tabController.view setNeedsLayout]; après avoir rejeté le modal dans le bloc d'achèvement.

[vc dismissViewControllerAnimated:YES completion:^(){ 
     UITabBarController* tabController = [UIApplication sharedApplication].delegate.window.rootViewController;
     [tabController.view setNeedsLayout];
}];
yogevbd
la source
2

L'UITabBar augmente en hauteur pour être au-dessus du bouton / de la ligne d'accueil, mais dessine la sous-vue à son emplacement d'origine et superpose l'UITabBarItem sur la sous-vue.

Pour contourner ce problème, vous pouvez détecter l'iPhone X, puis réduire la hauteur de la vue de 32 pixels pour vous assurer que la barre d'onglets est affichée dans la zone de sécurité au-dessus de la ligne d'accueil.

Par exemple, si vous créez votre TabBar, remplacez par programme

self.tabBarController = [[UITabBarController alloc] init];
self.window.rootViewController = self.tabBarController;

Avec ça:

#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] ;

REMARQUE: cela pourrait bien être un bogue, car les tailles de vue et la disposition de la barre d'onglets sont définies par le système d'exploitation. Il devrait probablement s'afficher selon la capture d'écran d'Apple dans les directives de l'interface humaine de l'iPhone X ici: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/

A. Badger
la source
1
Je vois, je n'ai pas créé la barre d'onglets par programme, j'ai utilisé le storyboard pour le construire avec des contraintes définies pour être le bas de l'écran. Cela me semble étrange que nous devions détecter s'il s'agit d'un iPhone X, puis revoir la mise en page, alors qu'ils ne font que grimper la hauteur de la TabBar sans aucun changement de code.
adrian chen le
Cela ressemble plus à un bogue pour moi maintenant, je pense que je vais faire un rapport de bogue à ce sujet et voir ce qui en sort. Merci de votre aide!!
adrian chen le
Ce n'est vraiment pas une bonne idée d'utiliser la hauteur exacte des limites de l'écran principal pour déterminer si l'application fonctionne sur iPhone X. Que se passe-t-il si le modèle de l'année prochaine a la même taille en points? Ou si l'application fonctionne en mode paysage?
roperklacks
La transparence ne semble pas affecter mes icônes mal définies. Ils sont foirés que l'UITabBar soit opaque ou transparent.
Adama
Il semblerait que vous ajoutez en fait 32px à la hauteur du cadre plutôt que d'en soustraire?
Perry
2

Mon cas était que j'avais défini une hauteur UITabBar personnalisée dans mon UITabBarController, comme ceci:

  override func viewWillLayoutSubviews() {            
        var tabFrame = tabBar.frame
        tabFrame.size.height = 60
        tabFrame.origin.y = self.view.frame.size.height - 60
        tabBar.frame = tabFrame
    }

La suppression de ce code était la solution pour que la TabBar s'affiche correctement sur l'iPhone X.

Gytis
la source
2

La solution la plus simple que j'ai trouvée était d'ajouter simplement un espace de 0,2 pt entre le bas de la barre d'onglets et le bas de safeAreaLayoutGuide.bottomAnchor comme ça.

tabBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -0.2)
Delta Whisky
la source
1

J'avais le même problème lorsque j'essayais de définir le cadre de UITabBar dans mon TabBarController personnalisé.

self.tabBar.frame = CGRectMake(0, self.view.frame.size.height - kTabBarHeight, self.view.frame.size.width, kTabBarHeight);

Lorsque je l'ai juste ajusté à la nouvelle taille, le problème a disparu

if(IS_IPHONE_X){
    self.tabBar.frame = CGRectMake(0, self.view.frame.size.height - kPhoneXTabBarHeight, self.view.frame.size.width, kPhoneXTabBarHeight);
}
else{
    self.tabBar.frame = CGRectMake(0, self.view.frame.size.height - kTabBarHeight, self.view.frame.size.width, kTabBarHeight);
}
Evgeny
la source
1
Quelles sont les valeurs de kPhoneXTabBarHeight ?
Tiago Veloso
Je viens d'ajouter 32 points à la valeur précédente de kTabBarHeight (qui était de 45). Mais vous n'êtes pas obligé de spécifier exactement la même valeur, pour moi, cela fonctionne également bien sans spécifier le cadre pour la tabBar. Mais si vous le spécifiez, vous devez ajuster la hauteur supplémentaire sur l'iPhone X.
Evgeny
1
Total hack, mais c'était la seule de ces solutions qui me convenait.
Kenny Wyland
Lorsque vous avez une vue personnalisée comme barre d'onglets, vous aimez utiliser ce hack pour adapter votre vue personnalisée à l'iPhone X.
Hemang
1
@Hemang non, c'était 45 ans pour ce projet auquel j'ai emprunté ce code.
Evgeny
1

J'ai rencontré cela aujourd'hui avec un UITabBar ajouté manuellement au contrôleur de vue dans le storyboard.Lors de l'alignement au bas de la zone de sécurité avec une constante de 0, j'obtiendrais le problème, mais le changer à 1 résoudrait le problème. Avoir l'UITabBar 1 pixel de plus que la normale était acceptable pour mon application.

Alan MacGregor
la source
Cela n'a pas fonctionné pour moi. J'utilisais un UITabBar qui a également été ajouté manuellement.
Kenny Wyland
1

Je me suis gratté la tête sur ce problème. Il semble être associé à la façon dont la tabBar est initialisée et ajoutée pour afficher la hiérarchie. J'ai également essayé les solutions ci-dessus telles que l'appel invalidateIntrinsicContentSize, la définition du cadre et également bottomInsetsdans une sous-classe UITabBar. Ils semblent cependant fonctionner temporairement et ils rompent avec un autre scénario ou régressent la barre d'onglets en provoquant un problème de mise en page ambigu. Lorsque j'ai débogué le problème, j'ai essayé d'attribuer les contraintes de hauteur à UITabBar et centerYAnchor, mais aucun n'a résolu le problème. J'ai réalisé dans le débogueur de vue que la hauteur de tabBar était correcte avant et après le problème reproduit, ce qui m'a amené à penser que le problème était dans les sous-vues. J'ai utilisé le code ci-dessous pour résoudre ce problème avec succès sans régresser aucun autre scénario.

- (void) viewWillTransitionToSize:(CGSize)size withTransitionCoordinator:(id<UIViewControllerTransitionCoordinator>)coordinator
{
    [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator];
    if (DEVICE_IS_IPHONEX())
    {
        [coordinator animateAlongsideTransition:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
            for (UIView *view in self.tabBar.subviews)
            {
                if ([NSStringFromClass(view.class) containsString:@"UITabBarButton"])
                {
                    if (@available (iOS 11, *))
                    {
                        [view.bottomAnchor constraintEqualToAnchor:view.superview.safeAreaLayoutGuide.bottomAnchor].active = YES;
                    }
                }
            }
        } completion:^(id<UIViewControllerTransitionCoordinatorContext>  _Nonnull context) {
            [self.tabBar layoutSubviews];
        }];
    }
}

Hypothèses: je ne fais cela que pour l'iPhone X, car il ne semble pas se reproduire sur aucun autre appareil pour le moment. Est basé sur l'hypothèse qu'Apple ne change pas le nom de la classe UITabBarButton dans les futures versions d'iOS. Nous faisons cela sur UITabBarButton uniquement lorsque cela signifie que si Apple ajoute plus de sous-vues internes à UITabBar, nous devrons peut-être modifier le code pour s'adapter à cela.

S'il vous plaît laissez-moi savoir si cela fonctionne, sera ouvert aux suggestions et améliorations!

Il devrait être simple de créer un équivalent rapide pour cela.

Rushabh
la source
J'ai mis ça dans viewDidAppear(animated:)mon UITabBarControlleret ça a bien fonctionné. Merci!
Albert Bori
1
quel paramètre u passé taille et coordinateur? de vue didAppear
sulabh
1

De ce tutoriel:

https://github.com/eggswift/ESTabBarController

et après l'initialisation de la barre d'onglets en écrivant cette ligne dans la classe appdelegate

(self.tabBarController.tabBar as? ESTabBar)?.itemCustomPositioning = .fillIncludeSeparator

Résout mon problème de barre d'onglets.

J'espère que cela résout votre problème

Merci

Siddh
la source
1

Sélectionnez la barre d'onglets et cochez la case "Enregistrer les marges relatives de la zone" dans l'éditeur d'inspecteur comme ceci:

entrez la description de l'image ici

AnnGoro
la source
1

J'ai eu le même problème, au début, il a été rendu correctement mais après l'installation badgeValuesur l'un des tabBarItem, il a cassé la mise en page. Ce qui a fonctionné pour moi sans sous-classer UITabBarétait ceci, sur ma UITabBarControllersous-classe déjà créée .

-(void)viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];
    NSLayoutYAxisAnchor *tabBarBottomAnchor = self.tabBar.bottomAnchor;
    NSLayoutYAxisAnchor *tabBarSuperviewBottomAnchor = self.tabBar.superview.bottomAnchor;
    [tabBarBottomAnchor constraintEqualToAnchor:tabBarSuperviewBottomAnchor].active = YES;
    [self.view layoutIfNeeded];
}

J'ai utilisé tabBar superview pour m'assurer que les contraintes / ancres sont sur la même hiérarchie de vues et éviter les plantages.

D'après ce que j'ai compris, puisque cela semble être un bogue UIKit, nous devons juste réécrire / redéfinir les contraintes de la barre d'onglets pour que le moteur de mise en page automatique puisse à nouveau disposer correctement la barre d'onglets.

rgkobashi
la source
0

Si vous avez une contrainte de hauteur pour la barre d'onglets, essayez de la supprimer.

Face au même problème et la suppression de cela a résolu le problème.

rustylepord
la source
0

J'ai créé un nouveau UITabBarController dans mon storyboard et poussé tous les contrôleurs de vue vers ce nouveau UITabBarConttoller. Donc, tout fonctionne bien dans le simulateur iPhone X.

Evgeniy Kubyshin
la source
Cela a également résolu le problème pour moi. Il y a quelque chose de différent dans la façon dont Xcode 9 IB génère le XML de UITabBarController qui a résolu le problème.
Tiago
0

Pour iPhone, vous pouvez le faire, sous-classe UITabBarController.

class MyTabBarController: UITabBarController {

override func viewDidLayoutSubviews() {
    super.viewDidLayoutSubviews()
    if #available(iOS 11, *) {
        self.tabBar.heightAnchor.constraint(equalToConstant: 40).isActive = true
        self.tabBar.invalidateIntrinsicContentSize()
    }
  }
}

Accédez à Storyboard et autorisez Utiliser le guide de mise en page de zone sûre et changez la classe de UITabbarController en MyTabBarController

PS Cette solution n'est pas testée en cas d'application universelle et iPad.

NaXir
la source
0

essayez de changer l'écran de démarrage avec une taille @ 3x est (3726 × 6624)

Sob7y
la source
Et si nous utilisons un Storyboard LaunchScreen?
Avineet Gupta
c'est bon, utilisez simplement la nouvelle taille
Sob7y
0

Pour moi, supprimez le [self.tabBar setBackgroundImage:]travail, c'est peut-être un bogue UIKit

KelaKing
la source
0

Pour moi, cela a résolu tous les problèmes:

    override func viewDidLayoutSubviews() {
        super.viewDidLayoutSubviews()
        let currentHeight = tabBar.frame.height
        tabBar.frame = CGRect(x: 0, y: view.frame.size.height - currentHeight, width: view.frame.size.width, height: currentHeight)
    }
Durdu
la source
0

J'utilisais un UITabBarControllerdans le storyboard et au début, cela fonctionnait bien pour moi, mais après la mise à niveau vers la nouvelle version de Xcode, cela a commencé à me poser des problèmes liés à la hauteur de la tabBar.

Pour moi, le correctif consistait à supprimer l'existant UITabBarControllerdu storyboard et à le recréer en le faisant glisser depuis la bibliothèque d'objets du générateur d'interface .

énigme
la source
0

Pour ceux qui écrivent entièrement par UITabBarControllerprogramme, vous pouvez utiliser UITabBarItem.appearance().titlePositionAdjustmentpour ajuster la position du titre

Donc, dans ce cas où vous souhaitez ajouter un espace entre l'icône et le titre, utilisez-le dans viewDidLoad:

    override func viewDidLoad() {
        super.viewDidLoad()

        // Specify amount to offset a position, positive for right or down, negative for left or up
        let verticalUIOffset = UIOffset(horizontal: 0, vertical: hasTopNotch() ? 5 : 0)

        UITabBarItem.appearance().titlePositionAdjustment = verticalUIOffset
    }

détection si l'appareil a un écran Notch:

  func hasTopNotch() -> Bool {
      if #available(iOS 11.0, tvOS 11.0, *) {
        return UIApplication.shared.delegate?.window??.safeAreaInsets.top ?? 0 > 20
      }
      return false
  }
Saeid
la source
-1

J'avais le même problème qui a été résolu en définissant les éléments de la tabBar après la disposition de la barre d'onglets.

Dans mon cas, le problème est survenu lorsque:

  1. Il existe un contrôleur de vue personnalisé
  2. Un UITabBar est créé dans l'initialiseur du contrôleur de vue
  3. Les éléments de la barre d'onglets sont définis avant le chargement de la vue
  4. Dans la vue a été chargée, la barre d'onglets est ajoutée à la vue principale du contrôleur de vue
  5. Ensuite, les éléments sont rendus comme vous le mentionnez.
Barbara R
la source
-1

Je pense que c'est un bug UIKit de iPhoneX. parce que ça marche:

if (@available(iOS 11.0, *)) {
    if ([UIApplication sharedApplication].keyWindow.safeAreaInsets.top > 0.0) {
       self.tabBarBottomLayoutConstraint.constant = 1.0;
    }
} 
RomanV
la source
pouvez-vous donner plus d'informations sur ce qu'est tabBarBottomLayoutConstraint?
user3099837
-1

Je pense que vous disposez peut-être de la barre d'onglets contre le guide de mise en page sécurisé inférieur. Ce n'est probablement pas ce que vous voulez car la barre d'onglets semble faire ses propres calculs pour positionner les éléments de la barre d'onglets en toute sécurité au-dessus de la ligne d'accueil dans l'iPhone X. Configurez votre contrainte inférieure contre le bas de la vue . Vous devriez voir qu'il se présente correctement sur l' iPhone X ainsi que sur d'autres iPhones.

sgtxvichoxsuave
la source