iPhone如何自定义UITabBarItem并去除圆角边缘

3
我试图自定义一个UITabBar。
我扩展了UITabBarItem,现在它有一个自定义的图片,但是我无法去掉圆角。
代码:
@interface CustomTabBarItem : UITabBarItem  
{
    UIImage *customHighlightedImage;
}

@property (nonatomic, retain) UIImage *customHighlightedImage;

@end

@implementation CustomTabBarItem

@synthesize customHighlightedImage;

- (void) dealloc
{
    [customHighlightedImage release]; customHighlightedImage=nil;
    [super dealloc];
}

-(UIImage *) selectedImage
{
    return self.customHighlightedImage;
}

@end

也许有人知道如何去掉图片周围的圆角矩形。谢谢提前。 Alex
5个回答

4

这虽然不太规范,但可以使用并已通过审核:

  • 调整选项卡栏的大小
  • 使用你自己大小的图片

在选项卡控制器设置中

    tabController   = [[UITabBarController alloc] init];
tabController.view.frame = CGRectMake(0, 72, 320, 480 - (82));
tabController.delegate = self;
UIImageView *bgImageView;
bgImageView = [ [ UIImageView alloc ] initWithImage: [UIImage imageNamed:TABBAR_BACKGROUND]];
bgImageView.frame = CGRectMake(0, -11, 320, 60);

[[tabController tabBar] addSubview:bgImageView];
[[tabController tabBar] sendSubviewToBack:bgImageView];
tabController.tabBar.frame = CGRectMake(0, 460 - (59 + 52 - 11), 320, 49);
[bgImageView release];

[window addSubview:tabController.view];

在TabViewController1的初始化方法中。
   - (id) init
{
    if(self = [super init])
    {       
        CustomTabBarItem *tabItem = [[CustomTabBarItem alloc]
                                     initWithTitle:@"" image:nil tag:0];

        tabItem.customHighlightedImage=[UIImage imageNamed:TABBAR_TAB_1_ACTIVE];
        tabItem.customStdImage=[UIImage imageNamed:TABBAR_TAB_1_DEFAULT];       

        self.tabBarItem=tabItem;
        [tabItem release]; 
        tabItem=nil;
    }

return self;
}

而且自定义选项卡栏看起来像这样
    @interface CustomTabBarItem : UITabBarItem  
    {
        UIImage *customHighlightedImage;
        UIImage *customStdImage;
    }

    @property (nonatomic, retain) UIImage *customHighlightedImage;
    @property (nonatomic, retain) UIImage *customStdImage;

    @end

#import "CustomTabBarItem.h"


@implementation CustomTabBarItem

@synthesize customHighlightedImage;
@synthesize customStdImage;

- (void) dealloc
{
    [customHighlightedImage release]; customHighlightedImage=nil;
    [customStdImage release]; customStdImage=nil;   
    [super dealloc];
}

-(UIImage *) selectedImage
{
    return self.customHighlightedImage;
}

-(UIImage *) unselectedImage
{
    return self.customStdImage;
}

@end

重要提示:

我对iPhone开发还很陌生,但我非常肯定有更少的hacky方法可以实现这个功能。此外,我已经通过了这种方法,但这并不意味着你也会自动通过。


3
感谢使用自定义标签栏项目解决这个问题。 目前还未得到苹果的批准。 这段代码将放入 tabController1.m 文件中。
    - (id) init
{   
    if(self = [super init])
    {
        CustomTabBarItem *tabItem = [[CustomTabBarItem alloc]
                                     initWithTitle:@"" image:nil tag:0];

        tabItem.customHighlightedImage=[UIImage imageNamed:TABBAR_TAB_4_ACTIVE];
        tabItem.customStdImage=[UIImage imageNamed:TABBAR_TAB_4_DEFAULT];       

        self.tabBarItem=tabItem;
        [tabItem release]; 
        tabItem=nil;    
    }
    return self;
}

自定义TabBarItem:

@interface CustomTabBarItem : UITabBarItem  
{
    UIImage *customHighlightedImage;
    UIImage *customStdImage;
}

@property (nonatomic, retain) UIImage *customHighlightedImage;
@property (nonatomic, retain) UIImage *customStdImage;

@end

#import "CustomTabBarItem.h"


@implementation CustomTabBarItem

@synthesize customHighlightedImage;
@synthesize customStdImage;

- (void) dealloc
{
    [customHighlightedImage release]; customHighlightedImage=nil;
    [customStdImage release]; customStdImage=nil;   
    [super dealloc];
}

-(UIImage *) selectedImage
{
    return self.customHighlightedImage;
}

-(UIImage *) unselectedImage
{
    return self.customStdImage;
}

@end

是的,它已经被批准了。搜索“cinemaxx”。 - Alex Milde
Alex,你是如何让红色/紫色背景在按钮激活时占据整个空间的? - Travis
我仍然得到了我的图标背后的突出区域,但无法让整个区域使用背景。 - Travis
抱歉耽搁了。我已经将其作为答案发布在底部。 - Alex Milde
谢谢...我有一个CustomUITabBarController和CustomUITabBarItem,我已经子类化并尝试让它们工作...唯一剩下的问题是高亮仍然显示...我会尝试使用下面的解决方案,如果我让它工作了,就会把它放在Github上。 - Travis
未选择的图像和已选择的图像在苹果公司没有引起任何问题。太奇怪了。 - Tudor

1
将有圆角的视图的cornerRadius设置为0:
view.layer.cornerRadius = 0;

此外,您可能需要添加一个 #include 来获取 CALayer 声明:
#import <QuartzCore/QuartzCore.h>

1

我在上述实现中有一个查询。

根据苹果公司的规定,我们不应该使用私有/未记录的API,

在上面的代码中,这两个方法

-(UIImage *) selectedImage {
    return self.customHighlightedImage; }

-(UIImage *) unselectedImage {
    return self.customStdImage; }

这些方法在自定义子类CustomTabBarItem中未被定义。

这些方法是UITabBarItem类中未记录/隐藏的方法,并在CustomTabBarItem类中被覆盖。

覆盖未记录的方法是否可以?

我仍然很惊讶这是如何被苹果批准的。 我需要一些澄清。


0

有没有其他应用程序使用这个代码进行验证?非常想知道我们是否被授权使用selectedImage和unselectedImage方法?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接