我有一个标签栏控制器(它是一个基于标签栏的应用程序,因此标签栏位于MainWindow.xib上)。在这个xib中,我添加了4个标签栏项目,并设置了所有标签栏项目的图像。因此,我面临两个问题:
1)图像是白色的,但是当我运行应用程序时,它会将标签栏项目上的所有图像显示为灰色。如何使其看起来与原始图像中的相同。
2)我有一个选定的图像,我想在当前选中的标签栏项目上添加。我该怎么办?
NICK的代码后更新:
嘿,在iOS 5中,您必须在app delegate中编写以下代码,用于设置选中和未选中的标签栏项目(类别解决方案仅适用于4):
if ([[[UIDevice currentDevice] systemVersion] floatValue]>4.9) {
NSString *selectedImageName,*unselectedImageName;
for (int counter = 0; counter < [self.tabBarController.tabBar.items count]; counter++) {
if (counter==0) {
selectedImageName = <someImagename>;
unselectedImageName = <someImagename>;
}
else if (counter==1) {
selectedImageName = <someImagename>;
unselectedImageName = <someImagename>;
}
.
.
else {
selectedImageName = <someImagename>;
unselectedImageName = <someImagename>;
}
UIImage *selectedImage = [UIImage imageNamed:selectedImageName];
UIImage *unselectedImage = [UIImage imageNamed:unselectedImageName];
UITabBarItem *item = [self.tabBarController.tabBar.items objectAtIndex:counter];
if ([item respondsToSelector:@selector(setFinishedSelectedImage:withFinishedUnselectedImage:)]) {
[item setFinishedSelectedImage:selectedImage withFinishedUnselectedImage:unselectedImage];
}
}
}
答案 0 :(得分:6)
将此类别添加到您的项目中。它会强制标签栏项目将原始图像用作禁用状态,而不是对它们应用灰色渐变:
@implementation UItabBarItem (CustomUnselectedImage)
- (UIImage *)unselectedImage
{
return self.image;
}
@end
这可能看起来像是在使用私有API,但我已经看到这在已批准的应用上多次使用。它实际上并不是调用私有方法,只是覆盖一个。
如果您需要为选定和未选择的图像指定不同的图像,最好的办法是使用UITabBarItem的tag属性和switch语句,如下所示:
@implementation UItabBarItem (Custom)
- (UIImage *)selectedImage
{
switch (self.tag)
{
case 1:
return [UIImage imageNamed:@"tab-selected1.png"];
case 2:
return [UIImage imageNamed:@"tab-selected2.png"];
etc...
}
}
- (UIImage *)unselectedImage
{
switch (self.tag)
{
case 1:
return [UIImage imageNamed:@"tab-unselected1.png"];
case 2:
return [UIImage imageNamed:@"tab-unselected2.png"];
etc...
}
}
@end
然后在界面构建器中,不必费心设置标签栏项目图像,因为它们将被忽略。而是将其标记设置为与您在switch语句中指定的图像相匹配。
请注意,如果您的应用中有多个标签栏,并且您不希望以这种方式覆盖所有标签栏,则可以在UITabBarItem的子类而不是类别上定义这些方法。然后,您可以将nib文件中的选项卡栏项设置为自定义子类而不是常规UITabBarItems,只有那些将受到影响。
编辑:
请注意,从iOS 5开始,使用UIAppearance API有更好的方法。这种技术应该仍然有效,但谁知道Apple现在是否可以开始打击它,因为有一种官方支持的方法。除非你真的需要iOS 4支持,否则最好使用新方法。
答案 1 :(得分:1)
基于http://blog.theanalogguy.be/对我有用。添加类别UItabBarItem(CustomUnselectedImage) - 没有效果=(
* .h
@interface CustomTabBarItem : UITabBarItem {
UIImage *customHighlightedImage;
UIImage *customNormalImage;
}
@property (nonatomic, retain) UIImage *customHighlightedImage;
@property (nonatomic, retain) UIImage *customNormalImage;
- (id)initWithTitle:(NSString *)title
normalImage:(UIImage *)normalImage
highlightedImage:(UIImage *)highlightedImage
tag:(NSInteger)tag;
@end
和* .m
#import "CustomTabBarItem.h"
@implementation CustomTabBarItem
@synthesize customHighlightedImage;
@synthesize customNormalImage;
- (id)initWithTitle:(NSString *)title
normalImage:(UIImage *)normalImage
highlightedImage:(UIImage *)highlightedImage
tag:(NSInteger)tag{
[self initWithTitle:title
image:nil
tag:tag];
[self setCustomNormalImage:normalImage];
[self setCustomHighlightedImage:highlightedImage];
return self;
}
- (void) dealloc
{
[customHighlightedImage release];
customHighlightedImage=nil;
[customNormalImage release];
customNormalImage=nil;
[super dealloc];
}
-(UIImage *) selectedImage
{
return self.customHighlightedImage;
}
-(UIImage *) unselectedImage
{
return self.customNormalImage;
}
@end
快乐编码=] -