So i have an app built in xcode 10.2.1 then I later run the app on Xcode 11. The app show black screen since the view doesnt have enough height(only 48.0, why???). All devices are working fine but iPhone 10 and 11 running on iOS 13 does have a bug.
Note: No storyboard used, the app was built in Xcode 10.2.1, swift 5, iOS 13 iPhone 5 - 8 are working fine
Here is the Hierarchy of the view: https://www.dropbox.com/s/e3mzzpwn8iozhc0/Screen%20Shot%202019-10-08%20at%2012.11.18%20PM.png?dl=0
I tried using SceneDelegate but didnt worked. I also tried to opted out using scenes.
AppDelegate.swift
var window: UIWindow?
private var appCoordinator: AppCoordinator!
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
FirebaseApp.configure()
window = UIWindow()
appCoordinator = AppCoordinator(window: window!)
appCoordinator.start{}
return true
}
AppCoordinator.swift
class AppCoordinator: BaseCoordinator {
private let window: UIWindow
private let dependencies: AppDependency
init(window: UIWindow) {
self.window = window
self.dependencies = AppDependency()
}
override func start(completion: @escaping CoordinatorCompletion) {
showTabBarController()
}
/// Always represent tabbar controller when authentication state changed
func showTabBarController() {
let tabCoordinator = TabCoordinator(window: window, dependencies: dependencies)
coordinate(to: tabCoordinator)
}
}
TabCoordinator.swift
class TabCoordinator: BaseCoordinator {
typealias Dependencies = HasAPIClient & HasUserManager & HasLanguageManager & HasSpotSocketEngine & HasFuturesSocketEngine
private let window: UIWindow
private let dependencies: Dependencies
enum SectionTab: Int, Menu {
//case home
case futures
case trading
case wallet
case account
func title(languageManager: LanguageManager) -> String {
switch self {
//case .home: return languageManager.localizedString("router.home")
case .futures: return languageManager.localizedString("router.futures")
case .trading: return languageManager.localizedString("router.spot")
case .wallet: return languageManager.localizedString("router.wallets")
case .account: return languageManager.localizedString("router.account")
}
}
var image: UIImage {
switch self {
//case .home: return UIImage.init(named: "icTabHome")!
case .futures: return UIImage.init(named: "icTabFutures")!
case .trading: return UIImage.init(named: "icTabTrading")!
case .wallet: return UIImage.init(named: "icTabWallet")!
case .account: return UIImage.init(named: "icTabAccount")!
}
}
var highlightedImage: UIImage {
switch self {
//case .home: return UIImage.init(named: "icTabHomeActive")!
case .futures: return UIImage.init(named: "icTabFutures")!
case .trading: return UIImage.init(named: "icTabTradingActive")!
case .wallet: return UIImage.init(named: "icTabWalletActive")!
case .account: return UIImage.init(named: "icTabAccountActive")!
}
}
}
init(window: UIWindow, dependencies: Dependencies) {
self.window = window
self.dependencies = dependencies
}
override func start(completion: @escaping CoordinatorCompletion) {
super.start(completion: completion)
let tabbarController = UITabBarController()
let tabs : [SectionTab] = [.futures, .trading, .wallet, .account]
let viewControllers = createViewControllers(tabs: tabs)
tabbarController.viewControllers = viewControllers.map{ $0.viewController }
tabbarController.view.backgroundColor = .white
tabbarController.tabBar.tintColor = UIColor.appLightBlue
tabbarController.tabBar.unselectedItemTintColor = UIColor.appDarkGray
let notification = Notification.Name.init(LanguageChangedNotification)
NotificationCenter.default.rx.notification(notification).subscribe({_ in
tabbarController.viewControllers?.enumerated().forEach({ (arg0) in
let (offset, vc) = arg0
vc.tabBarItem.title = tabs[offset].title(languageManager: self.dependencies.languageManager)
})
}).disposed(by: disposeBag)
window.rootViewController = tabbarController
window.makeKeyAndVisible()
}
private func createViewControllers(tabs: [SectionTab]) -> [(viewController: UIViewController, coordinator: BaseCoordinator)] {
return tabs.map({ (tab) -> (viewController: UIViewController, coordinator: BaseCoordinator) in
let viewController: UIViewController
let coordinator: BaseCoordinator
switch tab {
case .futures:
viewController = BTSENavigationController()
coordinator = FuturesCoordinator(navigationController: viewController as! BTSENavigationController, dependencies: dependencies)
coordinate(to: coordinator)
case .trading:
viewController = BTSENavigationController()
coordinator = SpotCoordinator(navigationController: viewController as! BTSENavigationController, dependencies: dependencies)
coordinate(to: coordinator)
case .wallet:
viewController = BTSENavigationController()
coordinator = WalletCoordinator(navigationController: viewController as! BTSENavigationController, dependencies: dependencies, url: self.dependencies.client.url(for: .wallets))
coordinate(to: coordinator)
case .account:
viewController = BTSENavigationController()
coordinator = AccountCoordinator(navigationController: viewController as! BTSENavigationController, dependencies: dependencies)
coordinate(to: coordinator)
}
viewController.tabBarItem = UITabBarItem.init(title: tab.title(languageManager: dependencies.languageManager), image: tab.image, selectedImage: tab.highlightedImage)
return (viewController: viewController, coordinator: coordinator)
})
}
}
The solution is this. To those who are stuck with this problem like me.
https://github.com/tonySwiftDev/UITabbar-fixIOS12.1Bug/issues/4
Thanks!