2010-03-24 8 views
2

selon ce post pour l'instant, Apple va également rejeter ce code?comment changer la couleur sélectionnée par UITabbar?

et comment implémenter ce que Apple approuvera?

@interface UITabBar (ColorExtensions) 
- (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur; 
@end 

@interface UITabBarItem (Private) 
@property(retain, nonatomic) UIImage *selectedImage; 
- (void)_updateView; 
@end 

@implementation UITabBar (ColorExtensions) 
- (void)recolorItemsWithColor:(UIColor *)color shadowColor:(UIColor *)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur 
{ 
     CGColorRef cgColor = [color CGColor]; 
     CGColorRef cgShadowColor = [shadowColor CGColor]; 
     for (UITabBarItem *item in [self items]) 
       if ([item respondsToSelector:@selector(selectedImage)] && 
        [item respondsToSelector:@selector(setSelectedImage:)] && 
        [item respondsToSelector:@selector(_updateView)]) 
       { 
         CGRect contextRect; 
         contextRect.origin.x = 0.0f; 
         contextRect.origin.y = 0.0f; 
         contextRect.size = [[item selectedImage] size]; 
         // Retrieve source image and begin image context 
         UIImage *itemImage = [item image]; 
         CGSize itemImageSize = [itemImage size]; 
         CGPoint itemImagePosition; 
         itemImagePosition.x = ceilf((contextRect.size.width - itemImageSize.width)/2); 
         itemImagePosition.y = ceilf((contextRect.size.height - itemImageSize.height)/2); 
         UIGraphicsBeginImageContext(contextRect.size); 
         CGContextRef c = UIGraphicsGetCurrentContext(); 
         // Setup shadow 
         CGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor); 
         // Setup transparency layer and clip to mask 
         CGContextBeginTransparencyLayer(c, NULL); 
         CGContextScaleCTM(c, 1.0, -1.0); 
         CGContextClipToMask(c, CGRectMake(itemImagePosition.x, -itemImagePosition.y, itemImageSize.width, -itemImageSize.height), [itemImage CGImage]); 
         // Fill and end the transparency layer 
         CGContextSetFillColorWithColor(c, cgColor); 
         contextRect.size.height = -contextRect.size.height; 
         CGContextFillRect(c, contextRect); 
         CGContextEndTransparencyLayer(c); 
         // Set selected image and end context 
         [item setSelectedImage:UIGraphicsGetImageFromCurrentImageContext()]; 
         UIGraphicsEndImageContext(); 
         // Update the view 
         [item _updateView]; 
       } 
} 
@end 
+0

Oui, Apple rejette toute solution .. ?? – Frade

Répondre

5

Oui, Apple va rejeter une application si vous utilisez ce code.

Je viens de faire rejeter une application pour utiliser des appels d'API privés. Plus précisément "_updateView". Et j'ai utilisé exactement le même code que ci-dessus.

(Si d'autres personnes disent que leur application se est approuvé avec le même code, il est juste parce qu'il n'a pas été vérifié pour l'utilisation des API privées.)

+0

Oui, Apple le rejette .. toute solution ?? toute aide serait appréciée. Merci – Frade

+0

Si vous développez uniquement pour iOS 5+, vous pouvez utiliser les méthodes 'appearance' pour configurer la barre d'onglets. Avant iOS 5, je créais généralement des images pour chaque état de la barre d'onglets (c'est-à-dire s'il y a trois éléments, j'ai besoin de trois images: une pour chaque élément sélectionné) et placez l'image sur toute la barre d'onglets. Une recherche de "barre d'onglets personnalisée" devrait donner beaucoup d'exemples. –

+0

Merci Jens! Je l'ai déjà fait;) J'espère Apple l'accepte .. – Frade

0

Je suggère au lieu de changer la couleur pourquoi ne pas utiliser sélectionné image tabbaritem, comme dans iOS 6 je changer l'image sélectionnée comme tabbatitem -

dans le contrôleur TabBar méthode déléguée

- (void)tabBarController:(UITabBarController *)tabBarController didSelectViewController:(UIViewController *)viewController 

{ 
    if([tabBarController selectedIndex] == 0) 
    { 
     [viewController.tabBarItem setFinishedSelectedImage:[UIImage imageNamed:@"selected.png"]withFinishedUnselectedImage:[UIImage imageNamed:@"unselect.png"]]; 
    }  
} 

grâce à ce que vous pouvez changer votre image.

Ou vous pouvez utiliser directement dans votre point de vue des contrôleurs init (ou viewWillAppear) méthode, comme

 [viewController.tabBarItem setFinishedSelectedImage:[UIImage imageNamed:@"selected.png"]withFinishedUnselectedImage:[UIImage imageNamed:@"unselect.png"]]; 
3
[[UITabBar appearance] setSelectedImageTintColor:[UIColor whiteColor]]; 
+0

où mettez-vous cela? Dans toute la vue, est-ce qu'il y a eu beaucoup de contrôleurs de vue d'élément de la barre d'onglets, ou dans le délégué de l'application, ou ailleurs? – TimWhiting

+0

cela va dans la méthode didFinishLaunchingWithOptions du délégué de l'application – TimWhiting

0

pour iOS 10 (ou supérieur):

Pour définir la couleur sélectionnée simplement définir:

let tabBarAppearace = UITabBar.appearance() 
tabBarAppearace.tintColor = UIColor.nowYouBlue 

ci-dessus fonctionne pour toutes les versions iOS actuellement pris en charge, mais à changer de couleur non sélectionnée:

if #available(iOS 10.0, *) { 
     tabBarAppearace.unselectedItemTintColor = UIColor.red 
    } else { 
     // Fallback on earlier versions 
    } 

Au-dessus du code ressemblera à ceci sur iOS 10.

enter image description here

Questions connexes