【问题标题】:iOS 7 BarButtonItem with image and title带有图像和标题的 iOS 7 BarButtonItem
【发布时间】:2013-10-12 13:37:46
【问题描述】:

我正在尝试弄清楚如何才能实现这样的目标:

这是一个工具栏,我想保留按钮标题文本,而不必使用图标和文本创建整个图像。如何将图标添加到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 中看到的那样,当我点击按钮内部和松开点击时,按钮没有正确动画.有什么想法吗?

【问题讨论】:

标签: objective-c ios7 uibarbuttonitem uitoolbar


【解决方案1】:

我解决了这个问题如下:

[Button **setTitleColor**:[UIColor colorWithRed:129/255.0f green:124/255.0f blue:110/255.0f alpha:1.0f] forState:**UIControlStateHighlighted**];

【讨论】:

    【解决方案2】:

    所以我设法以编程方式完成了我的解决方案...一些抱怨它不起作用的用户...那么如何使用图像和项目创建 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;
    }
    

    【讨论】:

    • 标签是否位于按钮下方?
    • 是吗?就像我在图片上看到的第一个答案一样...您可以通过调整 itemButton.contentEdgeInsets = UIEdgeInsetsMake(30, 0, 0, 0); 来控制位置;
    【解决方案3】:

    我对堆栈溢出的所有解决方案都不满意,因为我喜欢 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];
    }
    

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

    【讨论】:

    • 好吧,人们可能是盲人......对我来说仍然是非常有用的解决方案,我只是考虑以编程方式......
    • 我不得不承认,我很难弄清楚如何用直接代码翻译这个故事板解决方案。我只需要在代码中使用它......(为了记录,我没有否决你的答案。)到目前为止,我发现的其他解决方案对我来说也并不令人满意。创建一个同时具有图标和标签的 UIBarButtonItem 是多么的难... :-(
    • 在代码中模仿了这种结构,但是色调颜色仍然只应用于图像(位于子工具栏内的子栏按钮项中)而不应用于文本标签(即我正在尝试创建的栏按钮项内的子工具栏旁边的按钮标签......太令人困惑了......
    • Button Competition 已经在选择器和引用插座分配了修饰,所有其他 Button 用户和管理也是如此。然后,我用代码编辑答案的每个 selectButton 都会调用一个相同的方法,并且还有分页逻辑......但这是另一个故事......这在应用程序中完全没有问题......
    【解决方案4】:

    您可以将 UIButton 作为自定义视图嵌入到 UIBarButtonItem 中。您可以使用-setImage:forState:-setTitle:forState: 随心所欲地创建您的UIButton,包括图像和文本。

    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

    更多信息,请参阅the documentation for initWithCustomView:

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

    【讨论】:

    • Greg,如果我在UIBarButtonItem 中嵌入UIButton,我需要设置UIButton 的框架,但我不会,因为我使用自动布局。除此之外,如果我使用这种方式,当我点击它时按钮不会“淡出”(动画)。
    • @FredCollins,当你点击它时它应该会消失(我刚刚测试过)。您必须为状态等设置标题颜色,就像设置任何其他按钮一样。
    • 它会淡化文本,但不会淡化图标图像。对你有用吗?
    • 我添加了一个示例,说明如何在无需显式设置框架的情况下创建自定义按钮。
    • 是的,我的图标图像正在褪色。我用我正在使用的代码更新了我的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2013-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多