@@ -12,7 +12,8 @@ import { CoreTypes } from '../../core-types';
1212import { ImageSource } from '../../image-source' ;
1313import { profile } from '../../profiling' ;
1414import { Frame } from '../frame' ;
15- import { layout } from '../../utils' ;
15+ import { layout } from '../../utils/layout-helper' ;
16+ import { FONT_PREFIX , isFontIconURI , isSystemURI , SYSTEM_PREFIX } from '../../utils/common' ;
1617import { SDK_VERSION } from '../../utils/constants' ;
1718import { Device } from '../../platform' ;
1819export * from './tab-view-common' ;
@@ -239,7 +240,7 @@ export class TabViewItem extends TabViewItemBase {
239240 const parent = < TabView > this . parent ;
240241 const controller = this . __controller ;
241242 if ( parent && controller ) {
242- const icon = parent . _getIcon ( this . iconSource ) ;
243+ const icon = parent . _getIcon ( this ) ;
243244 const index = parent . items . indexOf ( this ) ;
244245 const title = getTransformedText ( this . title , this . style . textTransform ) ;
245246
@@ -456,7 +457,7 @@ export class TabView extends TabViewBase {
456457
457458 items . forEach ( ( item , i ) => {
458459 const controller = this . getViewController ( item ) ;
459- const icon = this . _getIcon ( item . iconSource ) ;
460+ const icon = this . _getIcon ( item ) ;
460461 const tabBarItem = UITabBarItem . alloc ( ) . initWithTitleImageTag ( item . title || '' , icon , i ) ;
461462 updateTitleAndIconPositions ( item , tabBarItem , controller ) ;
462463
@@ -492,20 +493,36 @@ export class TabView extends TabViewBase {
492493 }
493494 }
494495
495- public _getIcon ( iconSource : string ) : UIImage {
496- if ( ! iconSource ) {
496+ public _getIcon ( item : TabViewItem ) : UIImage {
497+ if ( ! item || ! item . iconSource ) {
497498 return null ;
498499 }
499500
500- let image : UIImage = this . _iconsCache [ iconSource ] ;
501+ let image : UIImage = this . _iconsCache [ item . iconSource ] ;
501502 if ( ! image ) {
502- const is = ImageSource . fromFileOrResourceSync ( iconSource ) ;
503+ let is : ImageSource ;
504+ if ( isSystemURI ( item . iconSource ) ) {
505+ is = ImageSource . fromSystemImageSync ( item . iconSource . slice ( SYSTEM_PREFIX . length ) ) ;
506+ } else if ( isFontIconURI ( item . iconSource ) ) {
507+ // Allow specifying a separate font family for the icon via style.iconFontFamily.
508+ // If provided, construct a Font from the family and (optionally) size from fontInternal.
509+ let iconFont = item . style . fontInternal ;
510+ const iconFontFamily = item . iconFontFamily || item . style . iconFontFamily ;
511+ if ( iconFontFamily ) {
512+ // Preserve size/style from existing fontInternal if present.
513+ const baseFont = item . style . fontInternal || Font . default ;
514+ iconFont = baseFont . withFontFamily ( iconFontFamily ) ;
515+ }
516+ is = ImageSource . fromFontIconCodeSync ( item . iconSource . slice ( FONT_PREFIX . length ) , iconFont , item . style . color ) ;
517+ } else {
518+ is = ImageSource . fromFileOrResourceSync ( item . iconSource ) ;
519+ }
503520 if ( is && is . ios ) {
504521 const originalRenderedImage = is . ios . imageWithRenderingMode ( this . _getIconRenderingMode ( ) ) ;
505- this . _iconsCache [ iconSource ] = originalRenderedImage ;
522+ this . _iconsCache [ item . iconSource ] = originalRenderedImage ;
506523 image = originalRenderedImage ;
507524 } else {
508- traceMissingIcon ( iconSource ) ;
525+ traceMissingIcon ( item . iconSource ) ;
509526 }
510527 }
511528
0 commit comments