Symulator iPhone'a X na iOS 11 Ikony i tytuły UITabBar renderowane na wierzchu pokrywają się nawzajem


134

Czy ktoś ma problem z symulatorem iPhone'a X wokół komponentu UITabBar?

Mój wydaje się renderować ikony i tytuł jeden na drugim, nie jestem pewien, czy czegoś mi brakuje, uruchomiłem go również w symulatorze iPhone'a 8 i jednym rzeczywistym urządzeniu, na którym wygląda dobrze, tak jak pokazano na plansza fabularna.

iPhone X:

Błąd iPhone X UITabBar

iPhone 8

Działa iPhone 8 UITabBar


1
Mój podobny problem: widok obrazu wskaźnika wyboru tonie w widoku tabBar o 16 punktach w iPhonie X.
Itachi

FYI - niestety nie jest to naprawione w Xcode 9.2beta
tdios

To jest błąd uikit, który nadal istnieje. Ograniczenia muszą być ustawione prawidłowo. Zobacz moją odpowiedź poniżej!
RyanM,

Miałem takie problemy Sprawdź tę odpowiedź stackoverflow.com/a/53524635/5441253
Maxime Ashurov

Odpowiedzi:


40

Udało mi się obejść ten problem, po prostu wywołując invalidateIntrinsicContentSize w UITabBar w viewDidLayoutSubviews.

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

Uwaga: dół paska kart będzie musiał znajdować się na dole widoku głównego, a nie w bezpiecznym obszarze, a pasek kart nie powinien mieć ograniczenia wysokości.


Mam pasek kart bez ograniczenia wysokości, ograniczony do Przewodnika układu dolnego i to nie zadziałało dla mnie. Jakieś inne pomysły?
Kenny Wyland

1
Nie działa, gdy homeVC przedstawia VC A, następnie odrzuca A i wypycha VC B z homeVC. To jest obejście stackoverflow.com/a/47225653/1553324
ooops

1
Dodanie tej metody w połączeniu z przypięciem paska zakładek do dołu jego nadzoru ( nie obszaru bezpiecznego) zadziałało.
Drew C

3
Musiałem też dodać [self.view layoutIfNeeded].
Iulian Onofrei

1
To działa, ale nauczyłem się, że muszę również zwrócić uwagę na rozmiary obrazów w przyciskach paska zakładek. W trybie poziomym (na urządzeniach kompaktowych, ale nie w modelach iPad i iPhone Plus) system wykorzystuje kompaktowy pasek kart, który powinien mieć mniejsze obrazy, które można ustawić za pomocą landscapeImagewłaściwości przycisku paska kart. Zalecane rozmiary znajdują się w [Apple HIG's] ( developer.apple.com/design/human-interface-guidelines/ios/… ) w sekcji Niestandardowy rozmiar ikony
RobP

25

Odpowiedź udzielona przez VoidLess rozwiązuje problemy TabBar tylko częściowo. Naprawia problemy z układem na pasku kart, ale jeśli używasz kontrolera widoku, który ukrywa pasek kart, pasek kart jest nieprawidłowo renderowany podczas animacji (aby go odtworzyć najlepiej 2 mają 2 segmenty - jeden modalny i jedno naciśnięcie. Jeśli zmienisz segmenty, możesz zobacz, że pasek kart jest renderowany nie na miejscu). Poniższy kod rozwiązuje oba problemy. Dobra robota, jabłko.

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
        }
    }
}

Kod celu 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

Kompletne rozwiązanie. Dzięki.
Sayalee Pote

4
Dziękuję za Twoją odpowiedź. Ale jak go używać w klasie UITabBarController?
Jojo

2
@Jojo, biorąc pod uwagę, ile kodu jest potrzebne do zapełnienia tabbar za pomocą kodu, zawsze tworzę uitabbarcontroller za pomocą scenorysów. Tam możesz przypisać własną klasę do paska kart. Mam nadzieję że to pomoże.
Raimundas Sakalauskas

ten problem nie występuje na prawdziwym urządzeniu Testowałem to na iPhone11 pro iOS 13
Akshay Jadhav

22

Istnieje sztuczka, dzięki której możemy rozwiązać problem.

Po prostu umieść swój UITabBar w UIView.

To naprawdę działa na mnie.

Możesz też skorzystać z tego łącza, aby uzyskać więcej informacji.


3
To działało dobrze, uiview, który po prostu zawiera UITabBar. Umieść więzy w bezpiecznych obszarach na UIView (L, R i Bottom), nadaj mu wysokość (49) i ogranicz UITabBar do UIView ze wszystkich stron.
sdsykes

1
To rozwiązanie zadziałało dla mnie. Nie używałem UITabController, tylko UITabBar.
Riccardo Tesio

1
Pracował dla mnie. Dzięki
Francis Lanthier

1
To mi pomogło! Dziękuję Ci!
Glenn

2
To działa, ale wtedy „niebezpieczny” obszar może nie mieć tego samego koloru co pasek kart (w przypadku, gdy super widok i pasek kart nie są tego samego koloru)
iDev

16

nadpisanie UITabBar sizeThatFits(_)dla 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
    }
}

Znakomity. Właśnie ustawiłem niestandardowy rozmiar mojego paska kart i zastanawiam się, dlaczego nie działa na iPhoneX. Inne rozwiązania nie działają dla mnie, ponieważ używam kontrolera paska kart i nie zawiera ograniczeń.
Jindřich Rohlík

12

Dodałem to do viewWillAppearmojego zwyczaju UITabBarController, ponieważ żadna z udzielonych odpowiedzi nie działała dla mnie:

tabBar.invalidateIntrinsicContentSize()
tabBar.superview?.setNeedsLayout()
tabBar.superview?.layoutSubviews()

1
Pomogło mi to rozwiązać problem związany z przenoszeniem paska tabBar na górę ekranu. Dziękuję Ci!
Jay

Ale nie dla mnie :(
Nick

9

Miałem ten sam problem.

wprowadź opis obrazu tutaj

Jeśli ustawię jakąkolwiek niezerową stałą na dolnym ograniczeniu UITabBar do bezpiecznego obszaru:

wprowadź opis obrazu tutaj

Zaczyna działać zgodnie z oczekiwaniami ...

wprowadź opis obrazu tutaj

To jedyna zmiana, jaką wprowadziłem i nie mam pojęcia, dlaczego to działa, ale jeśli ktoś to zrobi, chciałbym wiedzieć.


1
To właśnie zrobiłem na końcu, aby to działało, ale tak, nie mam pojęcia, dlaczego ani nie rozumiem, co robi. Dla mnie to wciąż jest jak błąd
adrian chen,

7

Odsuwanie paska kart o 1 punkt od dołu działało dla mnie.

Oczywiście w ten sposób otrzymasz lukę, którą będziesz musiał w jakiś sposób wypełnić, ale tekst / ikony są teraz prawidłowo ustawione.


7

Aha! To naprawdę magia!

W końcu doszedłem do tego po godzinach przeklinania Apple.

UIKit faktycznie obsługuje to za Ciebie i wygląda na to, że przesunięte elementy paska kart są spowodowane nieprawidłową konfiguracją (i prawdopodobnie rzeczywistym błędem UIKit). Nie ma potrzeby tworzenia podklas ani widoku w tle.

UITabBar „po prostu zadziała”, jeśli jest ograniczony do dolnej części widoku nadzoru, a NIE do dolnej strefy bezpiecznej .

Działa nawet w kreatorze interfejsów.

Prawidłowa konfiguracja

Praca w IB

  1. W narzędziu do tworzenia interfejsów, wyświetlając jako iPhone X, przeciągnij UITabBar do miejsca, w którym zostanie przyciągnięty do dolnej wstawki bezpiecznego obszaru. Po upuszczeniu powinien wyglądać poprawnie (wypełnij przestrzeń do dolnej krawędzi).
  2. Następnie możesz wykonać „Dodaj brakujące ograniczenia”, a IB doda odpowiednie ograniczenia, a pasek kart będzie działał magicznie na wszystkich iPhone'ach! (Zwróć uwagę, że dolne ograniczenie wygląda tak, jakby miało stałą wartość równą wysokości niebezpiecznego obszaru iPhone'a X, ale stała wynosi w rzeczywistości 0)

Czasami to nadal nie działa

Zepsuty w IB

Naprawdę głupie jest to, że możesz od razu zobaczyć błąd w IB, nawet jeśli dodasz dokładne ograniczenia, które IB dodaje w powyższych krokach!

  1. Wyciągnij UITabBar i nie przyciągaj go do dolnej wstawki bezpiecznego obszaru
  2. Dodaj początkowe, końcowe i dolne ograniczenia do superwiewu (nie jest to bezpieczny obszar). Dziwne, to samo się naprawi, jeśli wykonasz „Odwróć pierwszy i drugi element” w Inspektorze ograniczeń dla dolnego ograniczenia. ¯_ (ツ) _ / ¯

zmienił wszystkie ograniczenia z bezpiecznego obszaru na nadzór i pracę. Legend Ryan
RyanTCB

6

Naprawiono przez użycie podklasy UITabBar do zastosowania 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
    }
}

Rozwiązuje część problemów, ale nie wszystkie. Zobacz pełną odpowiedź poniżej
Raimundas Sakalauskas

U mnie zadziałało, kiedy próbuję zaprezentować VCA, a potem odrzucam VCA, wciskam VCB.
Tai Le

To działa dla mnie, ale muszę ustawić dolne ograniczenie na nadzór, a nie na bezpieczny obszar.
yajra

Co mam zrobić z nową klasą po jej utworzeniu? Próbowałem przeszukać moją aplikację pod kątem wystąpienia dowolnego UITabBar i zastąpić je SafeAreaFixTabBar ... Znalazłem następujące wystąpienia: func application (_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {SafeBarrea () .barTintColor = ... SafeAreaFixTabBar.appearance (). backgroundColor = ... SafeAreaFixTabBar.appearance (). tintColor = ... Ale nic nie naprawiłem
user1019042

4

Rozwiązany dla mnie dzwoniąc [tabController.view setNeedsLayout];po odrzuceniu modalu w bloku uzupełniania.

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

2

Wysokość paska UITabBar rośnie, aby znajdować się powyżej przycisku / linii ekranu głównego, ale rysuje widok podrzędny w jego pierwotnej lokalizacji i nakłada widok podrzędny na widok podrzędny UITabBarItem.

Aby obejść ten problem, możesz wykryć iPhone'a X, a następnie zmniejszyć wysokość widoku o 32 piksele, aby upewnić się, że pasek kart jest wyświetlany w bezpiecznym obszarze nad linią główną.

Na przykład, jeśli tworzysz swój TabBar programowo zamień

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

Z tym:

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

UWAGA: Może to być błąd, ponieważ rozmiary widoku i układ paska kart są ustawiane przez system operacyjny. Powinien prawdopodobnie wyświetlić się zgodnie ze zrzutem ekranu Apple w Wytycznych dotyczących interfejsu ludzkiego iPhone'a X tutaj: https://developer.apple.com/ios/human-interface-guidelines/overview/iphone-x/


1
widzę, nie utworzyłem paska kart programowo, użyłem scenorysu, aby zbudować go z ograniczeniami ustawionymi na dole ekranu. Wydaje mi się dziwne, że musimy wykryć, czy jest to iPhone X, a następnie przejść do zmiany układu, podczas gdy oni po prostu podnoszą wysokość paska TabBar samodzielnie bez żadnych zmian w kodzie.
adrian chen

Teraz wydaje mi się to bardziej jak błąd. Myślę, że zrobię raport o błędzie i zobaczę, co z tego wyniknie. Dzięki za pomoc!!
adrian chen

To naprawdę nie jest dobry pomysł, aby określić, czy aplikacja działa na iPhonie X, używając dokładnej wysokości głównych granic ekranu. Co się stanie, jeśli przyszłoroczny model będzie miał ten sam rozmiar w punktach? Lub jeśli aplikacja działa w trybie poziomym?
roperklacks

Wydaje się, że przezroczystość nie wpływa na nieprawidłowe ustawienie moich ikon. Są pomieszani bez względu na to, czy UITabBar jest nieprzezroczysty, czy przezroczysty.
Adama,

Wygląda na to, że w rzeczywistości dodajesz 32 piksele do wysokości ramki, zamiast odejmować od niej?
Perry

2

W moim przypadku ustawiłem niestandardową wysokość UITabBar w moim UITabBarController, na przykład:

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

Usunięcie tego kodu umożliwiło poprawne wyświetlanie paska TabBar na telefonie iPhone X.


2

Najprostszym rozwiązaniem, które znalazłem, było po prostu dodanie odstępu 0,2 pt między dolną krawędzią paska kart a dolną częścią pliku safeAreaLayoutGuide.bottomAnchor.

tabBar.bottomAnchor.constraint(equalTo: view.safeAreaLayoutGuide.bottomAnchor, constant: -0.2)

1

Miałem ten sam problem, gdy próbowałem ustawić ramkę UITabBar w moim niestandardowym TabBarController.

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

Kiedy dostosowałem go do nowego rozmiaru, problem zniknął

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);
}

1
Jakie są wartości kPhoneXTabBarHeight ?
Tiago Veloso,

Właśnie dodałem 32 punkty do poprzedniej wartości kTabBarHeight (która wynosiła 45). Ale nie musisz określać dokładnie tej samej wartości, dla mnie działa to również dobrze bez określania ramki dla tabBar. Ale jeśli to określisz, musisz dostosować do dodatkowej wysokości na iPhonie X.
Evgeny

1
Total hack, ale to było jedyne z tych rozwiązań, które sprawiło, że wyglądał dobrze dla mnie.
Kenny Wyland

Jeśli masz niestandardowy widok jako
pasek kart

1
@Hemang nie, to było 45 dla tego projektu, z którego pożyczyłem ten kod.
Evgeny

1

Spotkałem to dzisiaj z aa UITabBar ręcznie dodanym do kontrolera widoku w scenorysie, podczas wyrównywania do dołu bezpiecznego obszaru ze stałą równą 0 dostałbym problem, ale zmiana go na 1 rozwiązałaby problem. Posiadanie paska UITabBar o 1 piksel więcej niż normalnie było do zaakceptowania dla mojej aplikacji.


Nie działa dla mnie. Używałem UITabBar, który również został dodany ręcznie.
Kenny Wyland

1

Podrapałem się w głowę z powodu tego problemu. Wydaje się, że jest to związane ze sposobem inicjowania i dodawania tabBar w celu wyświetlenia hierarchii. Wypróbowałem również powyższe rozwiązania, takie jak wywołanie invalidateIntrinsicContentSize, ustawienie ramki, a także bottomInsetswewnątrz podklasy UITabBar. Wydaje się jednak, że działają one tymczasowo i przerywają jakiś inny scenariusz lub cofają pasek kart, powodując niejednoznaczny problem z układem. Podczas debugowania problemu próbowałem przypisać ograniczenia wysokości do UITabBar i centerYAnchor, jednak żadne z nich nie rozwiązało problemu. W debugerze zdałem sobie sprawę, że wysokość tabBar była poprawna przed i po odtworzeniu problemu, co doprowadziło mnie do wniosku, że problem występuje w podwidokach. Użyłem poniższego kodu, aby pomyślnie rozwiązać ten problem bez cofania żadnego innego scenariusza.

- (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];
        }];
    }
}

Założenia: robię to tylko dla iPhone'a X, ponieważ w tej chwili nie wydaje się, aby odtwarzał się na żadnym innym urządzeniu. Opiera się na założeniu, że Apple nie zmienia nazwy klasy UITabBarButton w przyszłych wydaniach iOS. Robimy to na UITabBarButton tylko wtedy, gdy oznacza to, że jeśli Apple doda więcej wewnętrznych podglądów do UITabBar, może być konieczne zmodyfikowanie kodu, aby dostosować się do tego.

Daj mi znać, czy to zadziała, będzie otwarty na sugestie i ulepszenia!

Stworzenie szybkiego odpowiednika powinno być proste.


Włożyłem to do viewDidAppear(animated:)mojego UITabBarControlleri działało dobrze. Dzięki!
Albert Bori

1
jaki parametr został przekazany, rozmiar i koordynator? z widoku didAppear
sulabh

1

Z tego samouczka:

https://github.com/eggswift/ESTabBarController

i po zainicjowaniu paska kart zapisując tę ​​linię w klasie appdelegate

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

Rozwiązuje mój problem z paskiem kart.

Mam nadzieję, że to rozwiązuje twój problem

Dzięki


1

Wybierz pasek kart i ustaw pole wyboru „Zapisz względne marginesy obszaru” w edytorze Inspector w następujący sposób:

wprowadź opis obrazu tutaj


1

Miałem podobny problem, początkowo był renderowany poprawnie, ale po ustawieniu badgeValuena jednym z tabBarItem zepsuł układ. To, co zadziałało dla mnie bez podklas, UITabBarbyło to, na mojej już utworzonej UITabBarControllerpodklasie.

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

Użyłem tabBar superview, aby upewnić się, że ograniczenia / kotwice są w tej samej hierarchii widoku i uniknąć awarii.

Opierając się na moim zrozumieniu, ponieważ wydaje się to być błędem UIKit, musimy tylko przepisać / ponownie ustawić ograniczenia paska kart, aby silnik automatycznego układu mógł ponownie poprawnie rozmieścić pasek kart.


0

Jeśli masz jakiekolwiek ograniczenie wysokości paska kart, spróbuj je usunąć.

Zmierzyłem się z tym samym problemem i usunięcie tego rozwiązało problem.


0

Utworzyłem nowy UITabBarController w mojej planszy i wypchnąłem wszystkie kontrolery widoku do tego nowego UITabBarConttoller. Tak więc wszystko działa dobrze w symulatorze iPhone'a X.


To również naprawiło to dla mnie. Jest coś innego w sposobie, w jaki Xcode 9 IB generuje kod XML UITabBarControllera, co rozwiązało problem.
Tiago

0

W przypadku iPhone'a możesz to zrobić, Subclass UITabBarController.

class MyTabBarController: UITabBarController {

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

Idź do Storyboard i zezwól na korzystanie z Safe Area Layout Guide i zmień klasę UITabbarController na MyTabBarController

PS To rozwiązanie nie jest testowane w przypadku aplikacji uniwersalnej i iPada.


0

spróbuj zmienić ekran powitalny z rozmiarem @ 3x (3726 × 6624)


Co jeśli używamy Storyboard LaunchScreen?
Avineet Gupta

w porządku, po prostu użyj splasha w nowym rozmiarze
Sob7y

0

Dla mnie usuń [self.tabBar setBackgroundImage:]pracę, może to błąd UIKit


0

Dla mnie to rozwiązało wszystkie problemy:

    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)
    }

0

Używałem UITabBarController w serii ujęć i na początku było to w porządku pracy dla mnie, ale po aktualizacji do nowszej wersji Xcode zaczęło dając mnie kwestie związane z wysokością umieszczenie zakładek.

Dla mnie poprawką było usunięcie istniejącego UITabBarControllerz storyboardu i ponowne utworzenie, przeciągając go z biblioteki obiektów kreatora interfejsu .


0

Dla tych, którzy piszą w całości UITabBarControllerprogramowo, możesz użyćUITabBarItem.appearance().titlePositionAdjustment do dostosowania pozycji tytułu

Więc w tym przypadku, jeśli chcesz dodać lukę między ikoną i tytułem, użyj jej w 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
    }

wykrywanie, czy urządzenie ma ekran Notch:

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

-1

Miałem ten sam problem, który został rozwiązany przez ustawienie elementów tabBar po ułożeniu paska kart.

W moim przypadku problem wystąpił, gdy:

  1. Istnieje niestandardowy kontroler widoku
  2. UITabBar jest tworzony w inicjatorze kontrolera widoku
  3. Elementy paska kart są ustawiane przed załadowaniem widoku
  4. W widoku zostało załadowane pasek zakładek jest dodawany do głównego widoku kontrolera widoku
  5. Następnie elementy są renderowane zgodnie z opisem.

-1

Myślę, że to błąd UIKit z iPhoneX. bo to działa:

if (@available(iOS 11.0, *)) {
    if ([UIApplication sharedApplication].keyWindow.safeAreaInsets.top > 0.0) {
       self.tabBarBottomLayoutConstraint.constant = 1.0;
    }
} 

czy możesz podać więcej informacji na temat tego, czym jest tabBarBottomLayoutConstraint?
user3099837

-1

Wydaje mi się, że możesz układać pasek kart z dolnym przewodnikiem po bezpiecznym układzie. Prawdopodobnie nie jest to to, czego chcesz, ponieważ pasek kart wydaje się wykonywać własne obliczenia, aby bezpiecznie pozycjonować elementy paska kart na górze linii głównej w telefonie iPhone X. Skonfiguruj dolne ograniczenie względem dołu nadzoru . Powinieneś zobaczyć, że działa poprawnie na iPhonie X, a także na innych iPhone'ach.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.