fix(ios): proper UITabBarAppearance handling

This commit is contained in:
Nathan Walker
2022-02-17 20:25:41 -08:00
parent b05650c416
commit 6c71ce21a2

View File

@ -14,23 +14,18 @@ import { profile } from '../../profiling';
import { Frame } from '../frame';
import { layout, iOSNativeHelper } from '../../utils';
import { Device } from '../../platform';
import { Transparent } from 'color/known-colors';
export * from './tab-view-common';
const majorVersion = iOSNativeHelper.MajorVersion;
const isPhone = Device.deviceType === 'Phone';
let UITabBarControllerImpl;
let UITabBarControllerDelegateImpl;
let UINavigationControllerDelegateImpl;
const setupControllers = function () {
if (typeof UITabBarControllerImpl === 'undefined') {
@NativeClass
class UITabBarControllerClass extends UITabBarController {
class UITabBarControllerImpl extends UITabBarController {
private _owner: WeakRef<TabView>;
public static initWithOwner(owner: WeakRef<TabView>): typeof UITabBarControllerImpl {
const handler = <typeof UITabBarControllerImpl>UITabBarControllerImpl.new();
public static initWithOwner(owner: WeakRef<TabView>): UITabBarControllerImpl {
const handler = <UITabBarControllerImpl>UITabBarControllerImpl.new();
handler._owner = owner;
return handler;
@ -93,16 +88,15 @@ const setupControllers = function () {
}
}
}
UITabBarControllerImpl = UITabBarControllerClass;
@NativeClass
class UITabBarControllerDelegateClass extends NSObject implements UITabBarControllerDelegate {
class UITabBarControllerDelegateImpl extends NSObject implements UITabBarControllerDelegate {
public static ObjCProtocols = [UITabBarControllerDelegate];
private _owner: WeakRef<TabView>;
public static initWithOwner(owner: WeakRef<TabView>): typeof UITabBarControllerDelegateImpl {
const delegate = <typeof UITabBarControllerDelegateImpl>UITabBarControllerDelegateImpl.new();
public static initWithOwner(owner: WeakRef<TabView>): UITabBarControllerDelegateImpl {
const delegate = <UITabBarControllerDelegateImpl>UITabBarControllerDelegateImpl.new();
delegate._owner = owner;
return delegate;
@ -142,16 +136,15 @@ const setupControllers = function () {
(<any>tabBarController)._willSelectViewController = undefined;
}
}
UITabBarControllerDelegateImpl = UITabBarControllerDelegateClass;
@NativeClass
class UINavigationControllerDelegateClass extends NSObject implements UINavigationControllerDelegate {
class UINavigationControllerDelegateImpl extends NSObject implements UINavigationControllerDelegate {
public static ObjCProtocols = [UINavigationControllerDelegate];
private _owner: WeakRef<TabView>;
public static initWithOwner(owner: WeakRef<TabView>): typeof UINavigationControllerDelegateImpl {
const delegate = <typeof UINavigationControllerDelegateImpl>UINavigationControllerDelegateImpl.new();
public static initWithOwner(owner: WeakRef<TabView>): UINavigationControllerDelegateImpl {
const delegate = <UINavigationControllerDelegateImpl>UINavigationControllerDelegateImpl.new();
delegate._owner = owner;
return delegate;
@ -183,11 +176,6 @@ const setupControllers = function () {
}
}
}
UINavigationControllerDelegateImpl = UINavigationControllerDelegateClass;
}
};
setupControllers();
function updateTitleAndIconPositions(tabItem: TabViewItem, tabBarItem: UITabBarItem, controller: UIViewController) {
if (!tabItem || !tabBarItem) {
@ -286,11 +274,11 @@ export class TabViewItem extends TabViewItemBase {
}
export class TabView extends TabViewBase {
public viewController: typeof UITabBarControllerImpl;
public viewController: UITabBarControllerImpl;
public items: TabViewItem[];
public _ios: typeof UITabBarControllerImpl;
private _delegate: typeof UITabBarControllerDelegateImpl;
private _moreNavigationControllerDelegate: typeof UINavigationControllerDelegateImpl;
public _ios: UITabBarControllerImpl;
private _delegate: UITabBarControllerDelegateImpl;
private _moreNavigationControllerDelegate: UINavigationControllerDelegateImpl;
private _iconsCache = {};
constructor() {
@ -534,6 +522,17 @@ export class TabView extends TabViewBase {
}
}
private _getAppearance(tabBar: UITabBar) {
return tabBar.standardAppearance ?? UITabBarAppearance.new();
}
private _updateAppearance(tabBar: UITabBar, appearance: UITabBarAppearance) {
tabBar.standardAppearance = appearance;
if (majorVersion >= 15) {
tabBar.scrollEdgeAppearance = appearance;
}
}
[selectedIndexProperty.setNative](value: number) {
if (Trace.isEnabled()) {
Trace.write('TabView._onSelectedIndexPropertyChangedSetNativeValue(' + value + ')', Trace.categories.Debug);
@ -571,12 +570,11 @@ export class TabView extends TabViewBase {
return this._ios.tabBar.barTintColor;
}
[tabBackgroundColorProperty.setNative](value: UIColor | Color) {
if (majorVersion >= 15) {
let appearance = UITabBarAppearance.new();
if (majorVersion >= 13) {
const appearance = this._getAppearance(this._ios.tabBar);
appearance.configureWithDefaultBackground();
appearance.backgroundColor = value instanceof Color ? value.ios : value;
this._ios.tabBar.scrollEdgeAppearance = appearance;
this._ios.tabBar.standardAppearance = appearance;
this._updateAppearance(this._ios.tabBar, appearance);
} else {
this._ios.tabBar.barTintColor = value instanceof Color ? value.ios : value;
}