在iPad应用程序中更改UITabbarItems的宽度和它们之间的边距

时间:2011-08-29 09:53:09

标签: iphone ipad uitabbarcontroller uitabbaritem

是否可以在UITabbar中更改UITabbarItem的宽度和iPad应用程序的每个UITabbarItem之间的边距?

问题是标准边距对于我的布局来说太大了 - 客户希望标签更紧凑:/

或者我应该使用UIToolbar来实现这个目标?

7 个答案:

答案 0 :(得分:2)

对于Tabbar项目宽度:

[[UITabBar appearance] setItemWidth:self.window.frame.size.width/NUMBER_OF_ITEMS];

对于tabbar框架:

[self.tabBar setFrame:rectFrame];

答案 1 :(得分:1)

我用这种方式解决了同样的问题: 我的目标是通过使用设计师为我发送的图像来自定义标签栏。

我附加了项目的.png文件,初始化了UIImage *类型的对应变量,并使用了UITabBarItem函数setFinishedSelectedImage:withFinishedUnselectedImage:来设置UITabbarItem的活动/非活动状态的图像:

UIImage * left_active, *left_inactive, *center_active, *center_inactive, *right_active, *right_inactive;
left_active = [UIImage imageNamed:@"left_active_img"];
...
[self.leftTabBarItem setFinishedSelectedImage:left_active withFinishedUnselectedImage:left_inactive];
[self.centerTabBarItem setFinishedSelectedImage:center_active withFinishedUnselectedImage:center_inactive];
[self.rightTabBarItem setFinishedSelectedImage:right_active withFinishedUnselectedImage:right_inactive];

但是定制的tabbarItems比设计师的图像更小,并且被分配在屏幕的中心位置:

2)为了解决这个问题,我添加了额外的UITABBARITEMS - 在初始的左边和右下角

3)创建了UITabBarItems的对应出口:

.H-文件:

@property (nonatomic, retain) IBOutlet UITabBar * tabBar;
// THE INTIAL items
@property (nonatomic, retain) IBOutlet UITabBarItem * leftTabBarItem;
@property (nonatomic, retain) IBOutlet UITabBarItem * centerTabBarItem;
@property (nonatomic, retain) IBOutlet UITabBarItem * rightTabBarItem;

// THE ADDITIONAL items
@property (nonatomic, retain) IBOutlet UITabBarItem * left_1;
@property (nonatomic, retain) IBOutlet UITabBarItem * left_2;
@property (nonatomic, retain) IBOutlet UITabBarItem * center_1;
@property (nonatomic, retain) IBOutlet UITabBarItem * center_2;
@property (nonatomic, retain) IBOutlet UITabBarItem * right_1;
@property (nonatomic, retain) IBOutlet UITabBarItem * right_2;
然后

按照下面列出的顺序将Outlets附加到UITabBarItem:

  • left_1
  • leftTabBarItem
  • left_2
  • center_1
  • centerTabBarItem
  • center_2
  • right_1
  • rightTabBarItem
  • right_2

并在委托类中更正UITabbarDelegate方法以仅切换甜菜可见项目 .M-文件:

#pragma mark - UITabbarDelegate
- (void)tabBar:(UITabBar *)tabBar didSelectItem:(UITabBarItem *)item{
    if (item == self.leftTabBarItem) 
    {
        NSLog(@"0"); // first visible item selected

    } else if (item == self.centerTabBarItem)
    {
        NSLog(@"1"); // second visible item selected   

    } else if (item == self.rightTabBarItem)
    {
        NSLog(@"2"); // third visible item selected
    } else if (item == self.left_1){
        [self.tabBar setSelectedItem: self.leftTabBarItem];
    } else if (item == self.left_2){
        [self.tabBar setSelectedItem: self.leftTabBarItem];
    } else if (item == self.center_1){
        [self.tabBar  setSelectedItem: self.centerTabBarItem];
    }else if (item == self.center_2){
        [self.tabBar setSelectedItem: self.centerTabBarItem];
    }else if (item == self.right_1){
        [self.tabBar setSelectedItem: self.rightTabBarItem];
    } else if (item == self.right_2){
        [self.tabBar setSelectedItem: self.rightTabBarItem];
    }
}

现在一切看起来都很正常。

您可以使用相同的步骤通过添加其他项目和更正委托方法来自定义UITabBarItem之间的大小和间隔。

答案 2 :(得分:0)

我认为不可能。您可以创建自定义选项卡栏。另外,使用默认UItabbar可能会导致在应用程序批准过程中被拒绝。

答案 3 :(得分:0)

您可以通过继承UITabBar并覆盖其layoutSubviews方法来更改选项卡栏项的间距。您将在self.subViews数组中找到所有标签栏按钮。他们的类是非公共UITabBarButton,但它们继承自UIControl,因此您可以识别所有标签栏按钮,检查它们是否是UIControl类。然后您只需要更改标签栏按钮的框架。

答案 4 :(得分:0)

您可以使用setSelectionIndicatorImage使标签更紧凑。

iPad中的UITabBarItem宽度将与selectionIndicatorImage的宽度相匹配

AppDelegate.m中的

[[UITabBar appearance] setItemWidth:self.window.frame.size.width/NUMBER_OF_YOUR_TAB];
[[UITabBar appearance] setItemSpacing:0];
[[UITabBar appearance] setSelectionIndicatorImage:[self imageFromColor:[UIColor clearColor] forSize:CGSizeMake(self.window.frame.size.width/NUMBER_OF_YOUR_TAB, 10) withCornerRadius:0]];

您可以使用以下代码以编程方式创建图像

- (UIImage *)imageFromColor:(UIColor *)color forSize:(CGSize)size withCornerRadius:(CGFloat)radius
{
    CGRect rect = CGRectMake(0, 0, size.width, size.height);
    UIGraphicsBeginImageContext(rect.size);

    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();    
    UIGraphicsBeginImageContext(size);
    [[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius] addClip];

    // Draw your image
    [image drawInRect:rect];

    image = UIGraphicsGetImageFromCurrentImageContext();

    UIGraphicsEndImageContext();

    return image;
}

答案 5 :(得分:0)

不需要子类化。

tabBarController.tabBar.itemPositioning = .centered
tabBarController.tabBar.itemWidth = 40
tabBarController.tabBar.itemSpacing = 38

答案 6 :(得分:-1)

您无法更改UITabBarItem的宽度,即使在对UITabBarItem进行子类化后也无法执行此操作。 Apple对开发人员实现应用程序的方式有一定的限制。

你需要使用UIToolBar,最好的选择是转到github,因为很多示例应用程序在底部使用可滚动的UIToolBar而不是UITabBar