Подтвердить что ты не робот

Фон вкладки отсутствует на iOS 7.1 после представления и отклонения контроллера вида

Я пробовал свое приложение на iOS 7.1, и я обнаружил, что фон панели вкладок несколько раз исчезает. Я смог отследить их; это происходит, когда:

  • нажатие контроллера просмотра, расположенного внутри контроллера навигации (то есть внутри контроллера панели вкладок) с помощью hidesBottomBarWhenPushed = YES
  • представляет контроллер представления, а затем отклоняет его (т.е. MFMailComposeViewController)

Я создал пример приложения (использовал шаблон панели вкладок + добавленная кнопка для отображения контроллера вида и mapView, чтобы узнать, исчез ли панель), и проблема там.

enter image description here

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

#import "FirstViewController.h"

@import MessageUI;

@interface FirstViewController () <MFMailComposeViewControllerDelegate>

@end

@implementation FirstViewController

- (IBAction)presentVCButtonPressed:(id)sender {
    if ([MFMailComposeViewController canSendMail]) {

        MFMailComposeViewController *mailer = [[MFMailComposeViewController alloc] init];
        mailer.mailComposeDelegate = self;
        [mailer setSubject:@"Feedback for Routie"];
        [mailer setToRecipients:@[@"[email protected]"]];
        [self presentViewController:mailer animated:YES completion:nil];
    }
}

- (void)mailComposeController:(MFMailComposeViewController *)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError *)error {
    [self dismissViewControllerAnimated:YES completion:nil];
}

@end

Здесь вы можете загрузить весь образец проекта.

Теперь важно: это не влияет на iPhone 5, ни на симулятор. Проблема заключается в iPhone 4 и iPod Touch (последнее поколение на момент написания этой статьи).

Есть ли у вас одна проблема? Вы могли это исправить? Спасибо!

Обновление: я нашел обходное решение. См. Мой ответ ниже.

4b9b3361

Ответ 1

Исправить найдено!

Итак, после некоторого расследования (и головной боли), я узнал, что есть простое исправление. Просто переключите свойство translucent, например:

tabBar.translucent = NO;
tabBar.translucent = YES;


Теперь, когда это сделать, для каждого случая есть несколько мест:

1) нажатие viewController с помощью hidesBottomBarWhenPushed = YES
Фон бара исчезает сразу после окончания поп-анимации, поэтому добавьте исправление в метод viewDidAppear: viewController, который его представил:

- (void)viewDidAppear:(BOOL)animated {
    self.navigationController.tabBarController.tabBar.translucent = NO;
    self.navigationController.tabBarController.tabBar.translucent = YES;
    ...
}


2) Представление контроллера представления, а затем его увольнение:
В этом случае фон панели вкладок уже исчез во время анимации увольнения. Вы можете сделать это в каждом viewController, который вы представляете отдельно, или, если у вас есть подклассы UITabBarController (как и у меня), вы можете добавить его в свой метод viewWillAppear. Просто имейте в виду, что вызов исправления сразу не поможет (я пробовал); поэтому я использовал функцию GCD dispatch_after:

- (void)viewWillAppear:(BOOL)animated {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
        self.tabBar.translucent = NO;
        self.tabBar.translucent = YES;
    });
    ...
}


Я знаю, что это не самый чистый способ, но это явно ошибка на стороне Apple, и он, вероятно, останется с нами некоторое время (я полагаю, что iOS 7.2 не будет, поэтому мы, скорее всего, будем придерживаться этого до тех пор, пока iOS 8).

Ответ 2

Прошло некоторое время, поэтому я повторно повторю проблему. Панель ввода iOS 7 (на устройстве) становится полностью видимой на устройстве, но отлично работает на Simulator. Появится сообщение, после нажатия Back с подробной страницы с включенным hidesBottomBarWhenPushed.

Установка Tab Bar Controller > Tab Bar > Background в White Color в Storyboard исправила его для меня. Это исправление сохраняет целостность.

По какой-то причине переключение tabBar.translucent выключено и снова в ViewDidAppear не работает для меня.

Использование Xcode 6.3.1 с Swift.

Ответ 3

Перейдите в свою Main.storyboard и выберите свой MKMapView, чтобы выделить его (см. в области Навигатор вы можете выбрать "Вид карты" ). Затем внимательно посмотрите, где находится нижний "белый квадрат": поднимите его на нижнюю планку! В инспекторе размеров вы можете проверить, где вы размещаете "якорь" или просмотреть начало для этого вида (см. Левую верхнюю часть вашего проекта). Это объясняет, почему это нормально для iphone 5, который имеет больший экран высот.