iOS 13 UITabBar RePosition to Top

Я выполнил этот ответ, чтобы переместить панель вкладок в верхнюю часть страницы. Он работал идеально до выпуска iOS 13. В iOS 13 панель вкладок видна внизу экрана. Любое другое обходное решение, которое я должен использовать?

Кто-нибудь сталкивался с такой же проблемой?

Обновление:

Ниже фрагмент кода, который я использовал в своем приложении:

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

    // Just a quick fix for making this to happen for iOS versions between 11.0 to 11.1
    // Updating the frame in Main queue.
    dispatch_async(dispatch_get_main_queue(), ^{
        [self changeTabBarPosition];
    });

    // Set the translucent property to NO then back to YES to
    // force the UITabBar to reblur, otherwise part of the
    // new frame will be completely transparent if we rotate
    // from a landscape orientation to a portrait orientation.

    self.tabBar.translucent = NO;
    self.tabBar.translucent = YES;
}

- (void)changeTabBarPosition {
    CGFloat tabSize = 44.0;
    UIInterfaceOrientation orientation = [UIApplication sharedApplication].statusBarOrientation;
    if (UIInterfaceOrientationIsLandscape(orientation)) {
        tabSize = 32.0;
    }
    CGRect tabFrame = self.tabBar.frame;
    tabFrame.size.height = tabSize;
    tabFrame.origin.y = [UIApplication sharedApplication].statusBarFrame.size.height;
    self.tabBar.frame = tabFrame;
}

person Praveenkumar    schedule 22.08.2019    source источник
comment
на самом деле statusBarOrientation устарела в iOS 13, поэтому проверьте и обновите свой код. покажи свой проверенный код   -  person Anbu.Karthik    schedule 22.08.2019
comment
откуда мы знаем, какой из них вы пробовали   -  person Anbu.Karthik    schedule 22.08.2019


Ответы (3)


Я нашел решение с помощью @Thanh Vu, упомянутого в его/ее ответе. Ниже фрагмент кода исправил мою проблему.

- (void) viewDidLayoutSubviews {
    [super viewDidLayoutSubviews];

    [self.tabBar invalidateIntrinsicContentSize];

    CGRect tabFrame = self.tabBar.frame;
    tabFrame.size.height = 44.0;
    tabFrame.origin.y = 0;
    self.tabBar.frame = tabFrame;

    // Set the translucent property to NO then back to YES to
    // force the UITabBar to reblur, otherwise part of the
    // new frame will be completely transparent if we rotate
    // from a landscape orientation to a portrait orientation.
    self.tabBar.translucent = NO;
    self.tabBar.translucent = YES;
}
person Praveenkumar    schedule 27.08.2019

Я просто тестирую приведенный ниже код на iOS 13. Он все еще работает.

- (void)viewDidLayoutSubviews {
  [super viewDidLayoutSubviews];
  self.tabBarController.tabBar.frame = CGRectMake(0, 0, self.view.frame.size.width, self.tabBarController.tabBar.frame.size.height);
}
person Thanh Vu    schedule 22.08.2019
comment
Я считаю, что вызов [super viewDidLayoutSubViews]; после смены кадра не очень хорош. - person Praveenkumar; 27.08.2019

Я получил это решение после долгой борьбы с Swift5 + IOS13.2Sdk. Следуйте этому ответ.

class MyUITabBarController:UITabBarController{
    override func viewDidLayoutSubviews(){
        super.viewDidLayoutSubviews()
        var frame = self.tabBar.frame
        frame.origin.y = 0
        self.tabBar.frame = frame
    }
}
person easy good bye    schedule 02.01.2020