我想在UIToolbar中创建一个“后退”左箭头边框按钮。

据我所知,获得其中一个的唯一方法是将UINavigationController保留在默认设置,它使用一个用于左侧栏项。但没有办法我可以找到创建一个作为一个UIBarButtonItem,所以我不能在一个标准的UIToolbar,即使他们非常类似于UINavigationBars。

我可以用按钮图像手动创建它,但我在任何地方都找不到源图像。它们有alpha通道边缘,所以截图和剪切不会得到非常通用的结果。

对于我打算使用的每种尺寸和配色方案,除了截图之外还有什么想法吗?

更新:请停止回避问题,并建议我不应该问这个,应该使用UINavigationBar。我的应用程序是Instapaper Pro。它只显示了一个底部工具栏(以节省空间和最大化可读内容区域),我希望在底部放置一个左箭头形状的后退按钮。

告诉我,我不需要这样做不是答案,当然也不值得赏金。


当前回答

在Xcode 5.x中使用Interface Builder很容易做到

使用对象库中的工具栏和栏按钮项 在按钮的属性检查器编辑图像部分 你的后退按钮图像

完成了!

其他回答

如果你不想麻烦图像文件,箭头形状可以用下面的代码在UIView子类中绘制:

- (void)drawRect:(CGRect)rect {
    float width = rect.size.width;
    float height = rect.size.height;
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextBeginPath(context);
    CGContextMoveToPoint(context, width * 5.0/6.0, height * 0.0/10.0);
    CGContextAddLineToPoint(context, width * 0.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 5.0/6.0, height * 10.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 9.0/10.0);
    CGContextAddLineToPoint(context, width * 2.0/6.0, height * 5.0/10.0);
    CGContextAddLineToPoint(context, width * 6.0/6.0, height * 1.0/10.0);
    CGContextClosePath(context);

    CGContextSetFillColorWithColor(context, [UIColor blackColor].CGColor);
    CGContextFillPath(context);
}

其中箭头视图是正比于宽度6.0和高度10.0

您可以通过从Other中提取源图像来找到它们。UIKit ${SDKROOT}/System/Library/Frameworks/UIKit.framework/Other.artwork。modding社区有一些提取它们的工具。一旦你提取图像,你可以写一些代码来根据需要重新着色,并将其设置为按钮图像。你是否真的可以发布这样的东西(因为你正在嵌入派生的艺术品)可能有点冒险,所以你可能需要和律师谈谈。

警告:有报道称这将无法在iOS 6上运行。这可能只适用于较旧版本的操作系统。显然,至少有一名开发者的应用因为使用这种技巧而被拒绝。使用风险自负。使用图像(见上面的答案)可能是一个更安全的解决方案。

这可以在不添加您自己的图像文件使用sekr1t按钮类型101来获得正确的形状。对我来说,窍门是找出我可以使用initWithCustomView来创建BarButtonItem。我个人需要这个动态导航栏而不是工具栏,但我用工具栏测试了它,代码几乎是一样的:

// create button
UIButton* backButton = [UIButton buttonWithType:101]; // left-pointing shape!
[backButton addTarget:self action:@selector(backAction) forControlEvents:UIControlEventTouchUpInside];
[backButton setTitle:@"Back" forState:UIControlStateNormal];

// create button item -- possible because UIButton subclasses UIView!
UIBarButtonItem* backItem = [[UIBarButtonItem alloc] initWithCustomView:backButton];

// add to toolbar, or to a navbar (you should only have one of these!)
[toolbar setItems:[NSArray arrayWithObject:backItem]];
navItem.leftBarButtonItem = backItem;

如果您在工具栏上执行此操作,则必须调整设置项的方式,但这取决于您的其余代码,我将其作为读者的练习。这个样例为我工作(编译和运行)。

等等,阅读HIG,不要使用未记录的特性,等等。只有六种支持的按钮类型,这不是其中之一。

试试这个。我相信你不需要一个后退按钮图像来创建这样一个。

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle:@"Back"
                                                               style:UIBarButtonItemStyleBordered
                                                              target:self
                                                              action:@selector(yourSelectorGoesHere:)];
self.navigationItem.backBarButtonItem = backButton;

这就是你所要做的:)

好吧,你不必为每个大小都有不同的按钮,你可以使用[UIImage stretchableImageWithLeftCapWidth:topCapHeight:],但我唯一发现的是自定义图像。