15

我试图弄清楚我怎样才能实现这样的目标:

在此处输入图像描述

这是一个工具栏,我想保留按钮标题文本,而不必使用图标和文本创建整个图像。如何UIBarButtonItem在保持文本设置的同时将图标添加到左侧:

UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Button" style:UIBarButtonItemStyleBordered target:nil action:nil];

编辑

这是我通过以下代码实现的:

    UIButton *customButton = [UIButton buttonWithType:UIButtonTypeCustom];
    [customButton setImage:[UIImage imageNamed:@"Test"] forState:UIControlStateNormal];
    [customButton setTitle:@"Button" forState:UIControlStateNormal];
    customButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 0, 0);
    [customButton sizeToFit];
    UIBarButtonItem *customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];

在此处输入图像描述

这里有两个问题:第一个是 的大小,UIButton第二个是,从 gif 中可以看出,当我点击按钮内部和松开点击时,按钮没有正确动画。有任何想法吗?

4

4 回答 4

33

您可以将 UIButton 作为自定义视图嵌入到 UIBarButtonItem 中。您可以根据需要创建 UIButton,包括使用图像和文本,使用-setImage:forState:-setTitle:forState:

UIButton* customButton = [UIButton buttonWithType:UIButtonTypeCustom];
[customButton setImage:[UIImage imageNamed:@"image"] forState:UIControlStateNormal];
[customButton setTitle:@"Button" forState:UIControlStateNormal];
[customButton sizeToFit];
UIBarButtonItem* customBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:customButton];
self.navigationItem.leftBarButtonItem = customBarButtonItem; // or self.navigationItem.rightBarButtonItem

请注意,执行此操作时,您需要将 IBAction 方法附加到customButton,而不是customBarButtonItem.

有关详细信息,请参阅initWithCustomView:.

您也可以在界面构建器中完成所有这些操作,只需将 UIButton 拖到导航栏上的左栏按钮/右栏按钮槽即可。

于 2013-10-05T17:16:06.493 回答
4

我对堆栈溢出的所有解决方案都不满意,因为我喜欢 UIBarButtonItenm 转换图像的方式,以便正确显示它们并且可以使用淡色更改它们。所以我发现了这个解决方案,我可以用很少的代码很好地使用......最终效果类似于 facebook 和其他当前应用程序中的工具栏......

在此处输入图像描述

当您更改包含在 UIBArButtonItem 图像颜色和标题颜色中的视图的色调颜色时,真的很酷,我根本不需要创建特殊图像。

这个代码是从每个按钮调用的,就像比赛按钮一样,按钮也被设置为引用插座......

- (void)selectButton:(UIButton *)sender { 
    _competitionButton.superview.tintColor = [UIColor lightGrayColor];
    _usersButton.superview.tintColor = [UIColor lightGrayColor]; 
    _managementButton.superview.tintColor = [UIColor lightGrayColor];    
    sender.superview.tintColor = [UIColor whiteColor]; 
}

- (IBAction)onCompetitionButtonClick:(UIButton *)sender {
    [self selectButton:sender];
    [_scrollView scrollToPage:0 of:3];
}

在像这样标题为 Competition 的按钮中只有标题,而在条形按钮项中只有图像......这就是我设置它的方式,它可以工作,也许还有其他可能性..

于 2015-02-05T15:58:07.643 回答
1

所以我设法以编程方式完成我的解决方案......一些抱怨它不起作用的用户......那么如何使用图像和项目创建 UTToolbar 以便您可以通过色调更改按钮的颜色,它会神奇地改变图像和标题标签 ?我的 UI 编辑器解决方案确实有效...在此代码中可以更清楚地说明问题,您也可以以编程方式进行...

- (void)loadToolbar {
    NSMutableArray *items = NSMutableArray.new;
    [items add:[UIBarButtonItem createWithItem:UIBarButtonSystemItemFlexibleSpace :nil :nil]];
    for (uint pageIndex = 0; pageIndex < _controllers.count; ++pageIndex) {
        UIView *itemView = [UIView.alloc initWithFrame:CGRectMake(0, 0, 100, 44)];
        itemView.backgroundColor = [UIColor clearColor];
        itemView.tintColor = [UIColor orangeColor];
        [itemView addSubview:[self createToolbarForItemView:pageIndex]];
        [itemView addSubview:[self createButtonForItemView:pageIndex]];
        UIBarButtonItem *item = [UIBarButtonItem.alloc initWithCustomView:itemView];
        item.style = UIBarButtonItemStylePlain;
        [items add:item];
        [items add:[UIBarButtonItem createWithItem:UIBarButtonSystemItemFlexibleSpace :nil :nil]];
    }
    [_toolbar setItems:items];
}

- (UIButton *)createButtonForItemView:(uint)pageIndex {
    UIButton *itemButton = [UIButton buttonWithType:UIButtonTypeSystem];
    itemButton.frame = CGRectMake(0, 0, 100, 44);
    itemButton.titleLabel.font = [UIFont systemFontOfSize:11];
    itemButton.contentEdgeInsets = UIEdgeInsetsMake(30, 0, 0, 0);
    itemButton.text = [_controllers[pageIndex] tabTitle];
    itemButton.touchUp = ^(UIButton *sender) {
        for (UIButton *button in _buttons) button.superview.tintColor = UI.toolBarInactiveButtonTextColor;
        sender.superview.tintColor = UI.toolBarActiveButtonTextColor;
        [self showPage:pageIndex];
    };
    [_buttons add:itemButton];
    return itemButton;
}

- (UIToolbar *)createToolbarForItemView:(uint)pageIndex {
    UIToolbar *itemToolbar = [UIToolbar.alloc initWithFrame:CGRectMake(0, 0, 100, 44)];
    itemToolbar.tintColor = nil;
    itemToolbar.barStyle = _toolbar.barStyle;
    itemToolbar.translucent = _toolbar.translucent;
    UIBarButtonItem *imageItem = [_controllers[pageIndex] tabImageItem];
    imageItem.style = UIBarButtonItemStylePlain;
    imageItem.tintColor = nil;
    imageItem.imageInsets = UIEdgeInsetsMake(-10, 0, 0, 0);
    itemToolbar.items = @[
            [UIBarButtonItem createWithItem:UIBarButtonSystemItemFlexibleSpace :nil :nil],
            imageItem,
            [UIBarButtonItem createWithItem:UIBarButtonSystemItemFlexibleSpace :nil :nil]
    ];
    return itemToolbar;
}
于 2016-05-15T18:41:19.313 回答
0

我解决了这个问题如下:

[Button **setTitleColor**:[UIColor colorWithRed:129/255.0f green:124/255.0f blue:110/255.0f alpha:1.0f] forState:**UIControlStateHighlighted**];
于 2015-04-20T06:19:48.960 回答