Apple a ajouté l'onglet de la barre de personnalisation de l'iOS 5, et maintenant, ce genre de choses est trivial. Avant cela, il a été un énorme hack, et n'est pas recommandé.
Voici comment faire un complètement personnalisés de la barre d'onglets:
//custom iconsUITabBarItem*item =[[UITabBarItem alloc] init];
item.title =@"foo";//setting custom images prevents the OS from applying a tint color[item setFinishedSelectedImage:[UIImage imageNamed:@"tab1_active.png"] withFinishedUnselectedImage:[UIImage imageNamed:@"tab1_image_deselected.png"]];
tab1ViewController.tabBarItem = item;//tab bar//set background image - will be used instead of glossy black
tabBarController.tabBar.backgroundImage =[UIImage imageNamed:@"tab_bar_bg.png"];//optionally set the tint color - setting this ti nil will result in the standard, blue tint color. tint color is ignored when custom icons are set as above.
tabBarController.tabBar.selectedImageTintColor =nil;//remove the highlight around the selected tab - or provide an alternate highlight image. If you don't do this the iOS default is to draw a highlighted box beneath the selected tab icon.
tabBarController.tabBar.selectionIndicatorImage =[[UIImage alloc] init];
Mentionné ci-dessus l'extrait de code ne fonctionne pas. Je suis en train d'ajouter une image à un onglet dans un tabbarcontroller mais rien n'est à se changer.Toute autre alternative?
Je ne suis pas sûr de ce que tu veux dire par "ça ne marche pas". Ce code est à partir de notre application où il est certainement plus de travail?!
C'est certainement la meilleure façon de le faire, et fonctionne tout à fait bien.
fonctionne très bien! Je pense que tabBarController.tabBar.selectionIndicatorImage = [[UIImage alloc] init]; n'est pas nécessaire
Dans ce cas, la teinture ne fonctionne pas
la teinture n'est pas de travail, c'est le point de l'ensemble de cette personnalisation. Si vous souhaitez teinter, et cela a changé de façon significative dans iOS 7, c'est une autre question.
C'est étonnamment difficile que la UITabBar ne pas fournir l'accès de sélectionner/désélectionner les images. Il peut être réalisé avec une API privée si:
@interfaceUITabBar(ColorExtensions)-(void)recolorItemsWithColor:(UIColor*)color shadowColor:(UIColor*)shadowColor shadowOffset:(CGSize)shadowOffset shadowBlur:(CGFloat)shadowBlur;@end@interfaceUITabBarItem(Private)@property(retain, nonatomic)UIImage*selectedImage;-(void)_updateView;@end@implementationUITabBar(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 contextUIImage*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 shadowCGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor);//Setup transparency layer and clip to maskCGContextBeginTransparencyLayer(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 layerCGContextSetFillColorWithColor(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
Il est très possible que Apple va rejeter une demande pour cela. Si l'API privée est supprimée dans une future mise à jour OS, -[UITabBar recolorItemsWithColor:shadowColor:shadowOffset:shadowBlur:] ne rien faire au lieu de s'écraser.
C'était une bonne suggestion, mais j'ai choisi une moins compliqué approche. Je sous-classé UIToolBar, ce qui lui a permis d'adapter la fonctionnalité d'un UITabBar sans son contrôle sur l'apparence et la sensation (UIToolBar prend en charge les vues personnalisées).
Quelqu'un peut-il me montrer comment je peux mettre en œuvre ce code dans un nouvel Onglet "Barre d'application" du projet?
mofie: Ajouter le code ci-dessus pour votre appdelegate, puis ajouter cet appel à applicationDidFinishLaunching: [[tabBarController tabBar] recolorItemsWithColor:[UIColor whiteColor] shadowColor:[UIColor blackColor] shadowOffset:CGSizeMake(0.0 f, -1.0 f) shadowBlur:3.0 f];
Il a été approuvé par Apple?
Je ne l'ai pas utilisé dans une application app store (je suis un jailbreak développeur)
comment avez-vous obtenir le dégradé dans les icônes? Lorsque j'ai mis une couleur je viens de plaine.
Utilisez +[UIColor colorWithPatternImage:]
Mon application a été rejetée en raison de "_updateView". Est-il un moyen de le faire sans elle?
Il y a, mais c'est de s'aventurer plus loin dans les "API privée" territoire
Comment puis-je utiliser "[UIColor colorWithPatternImage:]" pour obtenir le bleu brillant effet de l'original, mais avec une couleur différente?
-1: pas une bonne réponse, car il utilise une API privée.
clairement étiquetés comme tels. les gens peuvent prendre leurs propres décisions. tout le monde ne développe pour l'App Store
que pensez-vous de ma réponse énumérés ici ? Vous demandant d'aller à travers elle une fois.
Me semble qu'il fonctionne. N'a pas vraiment l'allure d'une UITabBar bien.
Cela ne fonctionne pas avec des graphismes Retina. Sur l'iPhone 4 avec iOS 5, il montre pixélisé graphiques.
Notez que UITabBarItem sur iOS 5 a API publique pour vous permettre de personnaliser les boutons. Utilisation - (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage. Utiliser en conjonction avec UITabBar propriétés backgroundImage et selectionIndicatorImage
Cela vous obtiendrez très proche de ce que fait Apple sur la tabbar mais, elle n'est pas exacte. Pour y arriver, il suffit d'ajouter deux points de plus/couleurs des composantes et de la place de NULL dans CGGradientCreateWithColorComponents, utilisez quelque chose comme {0,0.5,0.6,1.0}. En fait, vous avez besoin d'une couleur de fond et de trois alpha points (avec cadre de couleur en cours de toutes les 1s, car vous avez juste besoin d'ombrage tout en conservant un profil de couleur unique).
Je vais poster mon code, si ce n'est pas clair ... cheers.
J'ai ajouté le code comme une autre réponse ... ci-dessous.
Il y a près d'un an, mais ici, c'est le code. Ajouter une catégorie à UIImage ou de convertir à la classe. Rappelez-vous, l'image que vous êtes de passage (auto) doit être un alpha seule image (le masque est créé, basé sur les parties visibles de l'image).
-(UIImage*) imageWithBackgroundColor:(UIColor*)bgColor
shadeAlpha1:(CGFloat)alpha1
shadeAlpha2:(CGFloat)alpha2
shadeAlpha3:(CGFloat)alpha3
shadowColor:(UIColor*)shadowColor
shadowOffset:(CGSize)shadowOffset
shadowBlur:(CGFloat)shadowBlur {UIImage*image =self;CGColorRef cgColor =[bgColor CGColor];CGColorRef cgShadowColor =[shadowColor CGColor];CGFloat components[16]={1,1,1,alpha1,1,1,1,alpha1,1,1,1,alpha2,1,1,1,alpha3};CGFloat locations[4]={0,0.5,0.6,1};CGColorSpaceRef colorSpace =CGColorSpaceCreateDeviceRGB();CGGradientRef colorGradient =CGGradientCreateWithColorComponents(colorSpace, components, locations,(size_t)4);CGRect contextRect;
contextRect.origin.x =0.0f;
contextRect.origin.y =0.0f;
contextRect.size =[image size];//contextRect.size = CGSizeMake([image size].width+5,[image size].height+5); //Retrieve source image and begin image contextUIImage*itemImage = 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 shadowCGContextSetShadowWithColor(c, shadowOffset, shadowBlur, cgShadowColor);//Setup transparency layer and clip to maskCGContextBeginTransparencyLayer(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 layerCGContextSetFillColorWithColor(c, cgColor);
contextRect.size.height =-contextRect.size.height;CGContextFillRect(c, contextRect);CGContextDrawLinearGradient(c, colorGradient,CGPointZero,CGPointMake(contextRect.size.width*1.0/4.0,contextRect.size.height),0);CGContextEndTransparencyLayer(c);//CGPointMake(contextRect.size.width*3.0/4.0, 0)//Set selected image and end contextUIImage*resultImage =UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();CGColorSpaceRelease(colorSpace);CGGradientRelease(colorGradient);return resultImage;}
Par exemple, le suivant va produire un effet très semblable à ce que le natif tabbar n':
Cela permet de créer des effets similaires comme TabBarItem de l'image sélectionnée. C'est proche, mais pas parfait. Merci beaucoup!
Ce produit low-res graphiques sur la rétine des appareils. Pourquoi?
Pour renvoyer une image de la même résolution que l'original, remplacer le UIGraphicsBeginImageContext(contextRect.size) appel avec UIGraphicsBeginImageContextWithOptions(contextRect.size, NO, self.scale). Gardez à l'esprit que cette fonction n'est disponible que sous iOS 4.0 et versions ultérieures.
J'ai posé une question sur la façon dont la couleur de la "offstate" d'un bouton. Quelqu'un m'a donné une solution qui a également eu le bonus de retrait du gradient. voici la quesiton et sa réponse:
Apple a ajouté l'onglet de la barre de personnalisation de l'iOS 5, et maintenant, ce genre de choses est trivial. Avant cela, il a été un énorme hack, et n'est pas recommandé.
Voici comment faire un complètement personnalisés de la barre d'onglets:
tabBarController.tabBar.selectionIndicatorImage = [[UIImage alloc] init];
n'est pas nécessaireC'est étonnamment difficile que la
UITabBar
ne pas fournir l'accès de sélectionner/désélectionner les images. Il peut être réalisé avec une API privée si:On peut même créer quelques jolis effets sympas:
(source: booleanmagic.com)
Il est très possible que Apple va rejeter une demande pour cela. Si l'API privée est supprimée dans une future mise à jour OS,
-[UITabBar recolorItemsWithColor:shadowColor:shadowOffset:shadowBlur:]
ne rien faire au lieu de s'écraser.UITabBar
bien.UITabBarItem
sur iOS 5 a API publique pour vous permettre de personnaliser les boutons. Utilisation- (void)setFinishedSelectedImage:(UIImage *)selectedImage withFinishedUnselectedImage:(UIImage *)unselectedImage
. Utiliser en conjonction avecUITabBar
propriétésbackgroundImage
etselectionIndicatorImage
L'ajout de gradient est très simple, ajoutez les lignes de code suivantes:
Cela vous obtiendrez très proche de ce que fait Apple sur la tabbar mais, elle n'est pas exacte. Pour y arriver, il suffit d'ajouter deux points de plus/couleurs des composantes et de la place de
NULL
dansCGGradientCreateWithColorComponents
, utilisez quelque chose comme{0,0.5,0.6,1.0}
. En fait, vous avez besoin d'une couleur de fond et de trois alpha points (avec cadre de couleur en cours de toutes les 1s, car vous avez juste besoin d'ombrage tout en conservant un profil de couleur unique).Je vais poster mon code, si ce n'est pas clair ... cheers.
Il y a près d'un an, mais ici, c'est le code. Ajouter une catégorie à UIImage ou de convertir à la classe. Rappelez-vous, l'image que vous êtes de passage (auto) doit être un alpha seule image (le masque est créé, basé sur les parties visibles de l'image).
Par exemple, le suivant va produire un effet très semblable à ce que le natif tabbar n':
UIGraphicsBeginImageContext(contextRect.size)
appel avecUIGraphicsBeginImageContextWithOptions(contextRect.size, NO, self.scale)
. Gardez à l'esprit que cette fonction n'est disponible que sous iOS 4.0 et versions ultérieures.Il y a une solution à cela en utilisant une mesure mise en œuvre de la barre d'onglets à la iDev Recettes du site.
http://idevrecipes.com/2011/01/04/how-does-the-twitter-iphone-app-implement-a-custom-tab-bar
Utiliser les images Suivantes ( en Supposant, tabBar est d'avoir 5 Onglets comme suit )
Créer un nouveau projet à l'aide d' - "TabBar Application" template & Place à la suite du code.
Contenu de AppDel.h Fichier.
Contenu de AppDel.m Fichier.
J'ai posé une question sur la façon dont la couleur de la "offstate" d'un bouton. Quelqu'un m'a donné une solution qui a également eu le bonus de retrait du gradient. voici la quesiton et sa réponse:
Q: iphone - tabbar ensemble imagetintcolor (offstate)
A: Prendre un coup d'oeil à la "Gestion du Fini et de l'Image Sélectionnée" la tâche de la section de la documentation de UITabBarItem.