在UIToolbar上创build左箭头button(如UINavigationBar的“后退”样式)

我很想在UIToolbar创build一个“后退”左箭头挡板button。

据我所知,获得其中一个的唯一方法是将UINavigationController保留在默认设置下,并使用左边栏项。 但是,我无法将其创build为UIBarButtonItem ,因此我无法在标准UIToolbar创build一个,即使它们与UINavigationBar非常相似。

我可以手动创buildbutton图像,但我无法find任何地方的源图像。 他们有阿尔法通道边缘,所以截图和切割不会得到非常灵活的结​​果。

除了我打算使用的每种尺寸和颜色scheme的屏幕截图以外的任何想法?

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

告诉我,我不应该这样做,这不是一个答案 ,当然不值得一个赏金。

我使用了从http://www.teehanlax.com/blog/?p=447得到的以下psd

http://www.chrisandtennille.com/pictures/backbutton.psd

然后我创build了一个自定义UIView,我在工具栏项目的customView属性中使用。

适合我。


编辑: 正如PrairieHippo所指出的那样maralbjo发现使用下面的简单的代码来实现这个技巧(需要捆绑自定义图像)应该和这个答案结合起来。 所以这里是附加的代码:

 // Creates a back button instead of default behaviour (displaying title of previous screen) UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(backAction)]; tipsDetailViewController.navigationItem.leftBarButtonItem = backButton; [backButton release]; 

Unicode方法

我认为使用unicodeangular色完成工作要容易得多。 您可以通过searchUnicode三angular形或Unicode箭头来查看箭头 。 从iOS6开始,Apple将字符改为具有边框的表情符号字符。 要禁用边界,我添加0xFE0E Unicode变体select器 。

 NSString *backArrowString = @"\U000025C0\U0000FE0E"; //BLACK LEFT-POINTING TRIANGLE PLUS VARIATION SELECTOR UIBarButtonItem *backBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:backArrowString style:UIBarButtonItemStylePlain target:nil action:nil]; self.navigationItem.leftButtonItem = backBarButtonItem; 

代码块仅用于演示。 它将在任何接受NSString的button中工作。

要查看完整的字符列表,请在Google上searchUnicode字符以及您想要的内容。 这里是黑色左三angular的入口。

结果

结果

警告:有报告说这不适用于iOS 6.这可能只适用于旧版本的操作系统。 显然至less有一个开发者因为使用这个技巧而被拒绝了(见评论)。 使用风险自负。 使用图片(见上面的答案)可能是一个更安全的解决scheme。

这可以在不使用sekr1tbuttontypes101添加自己的图像文件的情况下完成,以获得正确的形状。 对我来说,诀窍是搞清楚,我可以使用'initWithCustomView'来创build栏button项。 我个人需要这个dynamic的导航栏,而不是一个工具栏,但我testing了一个工具栏和代码是几乎相同的:

 // 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; 

如果你在工具栏上这样做,你将不得不调整你如何设置项目,但这取决于你的代码的其余部分,我把它作为读者的练习。 :P这个例子为我工作(编译和运行)。

Blah等等,阅读HIG,不要使用无证的function,以及所有这些。 只有六个支持的buttontypes,这不是其中之一。

在这里输入图像描述

首先,你必须find后退button的图像。 我使用了一个名为Extractor的好应用程序,它从iPhone中提取所有graphics。 在iOS7中,我设法检索名为UINavigationBarBackIndicatorDefault的图像,它是黑色的,因为我需要一个红色的色调,使用GIMP将颜色改为红色。

编辑:

正如bate在他的评论中提到的那样 ,没有必要用图像编辑器改变颜色。 下面的代码应该做的伎俩:

 imageView.tint = [UIColor redColor]; imageView.image = [[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate]; 

然后我创build了一个视图,该视图包含一个带有箭头的imageView,一个带有自定义文本的标签,并且在视图顶部有一个带有动作的button。 然后,我添加了一个简单的animation(淡入淡出和翻译)。

以下代码模拟后退button的行为,包括animation。

 -(void)viewWillAppear:(BOOL)animated{ UIImageView *imageView=[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"]]; [imageView setTintColor:[UIColor redColor]]; UILabel *label=[[UILabel alloc] init]; [label setTextColor:[UIColor redColor]]; [label setText:@"Blog"]; [label sizeToFit]; int space=6; label.frame=CGRectMake(imageView.frame.origin.x+imageView.frame.size.width+space, label.frame.origin.y, label.frame.size.width, label.frame.size.height); UIView *view=[[UIView alloc] initWithFrame:CGRectMake(0, 0, label.frame.size.width+imageView.frame.size.width+space, imageView.frame.size.height)]; view.bounds=CGRectMake(view.bounds.origin.x+8, view.bounds.origin.y-1, view.bounds.size.width, view.bounds.size.height); [view addSubview:imageView]; [view addSubview:label]; UIButton *button=[[UIButton alloc] initWithFrame:view.frame]; [button addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside]; [view addSubview:button]; [UIView animateWithDuration:0.33 delay:0 options:UIViewAnimationOptionCurveLinear animations:^{ label.alpha = 0.0; CGRect orig=label.frame; label.frame=CGRectMake(label.frame.origin.x+25, label.frame.origin.y, label.frame.size.width, label.frame.size.height); label.alpha = 1.0; label.frame=orig; } completion:nil]; UIBarButtonItem *backButton =[[UIBarButtonItem alloc] initWithCustomView:view]; } - (void) handleBack:(id)sender{ } 

编辑:

而不是添加button,在我看来,更好的方法是使用手势识别器。

 UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBack:)]; [view addGestureRecognizer:tap]; [view setUserInteractionEnabled:YES]; 

我不知道这是否可行,但你可以尝试创build一个UINavigationController的默认设置来创buildbutton,find导航控制器的子视图层次结构中的button,调用removeFromSuperview ,销毁导航控制器,然后添加button作为您的工具栏的子视图。 您可能还需要在调用removeFromSuperview之前retainbutton(然后在将其添加为工具栏的子视图后将其release ),以避免在此过程中释放该button。

为了使UIButton的箭头非常接近(我不是devise师;)到iOS 7系统后退箭头:

标准:

标准系统后退箭头

苹果SD哥特式新

苹果SD哥特式新<字符

在Xcode中:

  • 关注button的标题值字段(或任何其他具有文本内容的视图/控件)
  • 打开编辑 – >特殊字符
  • select圆括号组,然后双击“<”字符
  • 更改字体为:苹果SD哥特式新,常规与所需的大小(如20)
  • 改变颜色,只要你喜欢

Ref @ staticVoidMan对iOS 7上的Back-like箭头的回答

后退箭头

如果您不想打扰图像文件,可以使用以下代码在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的高度成比例

  self.navigationItem.leftBarButtonItem = self.navigationItem.backBarButtonItem; 

为我工作。 我使用这个时,我有更多的选项卡,然后可以适应在标签栏上,并从“更多”推视图控制器覆盖leftBarButtonItem在其viewDidLoad。

您可以从UIKit $ {SDKROOT} /System/Library/Frameworks/UIKit.framework/Other.artwork中的Other.artwork中提取源图像。 修改社区有一些工具来提取它们, 在这里 。 一旦你提取图像,你可以编写一些代码来重新着色,并将其设置为button图像。 无论你是否真的可以运送这样的东西(因为你embedded了衍生艺术品)可能有点冒险,所以也许你想和一个律师谈谈。

Three20图书馆有办法做到这一点:

  UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithTitle: @"Title" style:UIBarButtonItemStylePlain target:self action:@selector(foo)]; UIColor* darkBlue = RGBCOLOR(109, 132, 162); TTShapeStyle* style = [TTShapeStyle styleWithShape:[TTRoundedLeftArrowShape shapeWithRadius:4.5] next: [TTShadowStyle styleWithColor:RGBCOLOR(255,255,255) blur:1 offset:CGSizeMake(0, 1) next: [TTReflectiveFillStyle styleWithColor:darkBlue next: [TTBevelBorderStyle styleWithHighlight:[darkBlue shadow] shadow:[darkBlue multiplyHue:1 saturation:0.5 value:0.5] width:1 lightSource:270 next: [TTInsetStyle styleWithInset:UIEdgeInsetsMake(0, -1, 0, -1) next: [TTBevelBorderStyle styleWithHighlight:nil shadow:RGBACOLOR(0,0,0,0.15) width:1 lightSource:270 next:nil]]]]]]; TTView* view = [[[TTView alloc] initWithFrame:CGRectMake(0, 0, 80, 35)] autorelease]; view.backgroundColor = [UIColor clearColor]; view.style = style; backButton.customView = view; self.navigationItem.leftBarButtonItem = backButton; 

我发现,使用下面的简单的代码做了这个窍门(需要捆绑自定义图像):

 // Creates a back button instead of default behaviour (displaying title of previous screen) UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"back_arrow.png"] style:UIBarButtonItemStyleBordered target:self action:@selector(backAction)]; tipsDetailViewController.navigationItem.leftBarButtonItem = backButton; [backButton release]; 

这是我通过search所有这些解决scheme和其他人后,最终做了什么。 它使用从UIKit股票图像中提取的可伸缩PNG的。 这样你就可以把文字设置成任何你想要的东西

 // Generate the background images UIImage *stretchableBackButton = [[UIImage imageNamed:@"UINavigationBarDefaultBack.png"] stretchableImageWithLeftCapWidth:14 topCapHeight:0]; UIImage *stretchableBackButtonPressed = [[UIImage imageNamed:@"UINavigationBarDefaultBackPressed.png"] stretchableImageWithLeftCapWidth:13 topCapHeight:0]; // Setup the UIButton UIButton *backButton = [UIButton buttonWithType:UIButtonTypeCustom]; [backButton setBackgroundImage:stretchableBackButton forState:UIControlStateNormal]; [backButton setBackgroundImage:stretchableBackButtonPressed forState:UIControlStateSelected]; NSString *buttonTitle = NSLocalizedString(@"Back", @"Back"); [backButton setTitle:buttonTitle forState:UIControlStateNormal]; [backButton setTitle:buttonTitle forState:UIControlStateSelected]; backButton.titleEdgeInsets = UIEdgeInsetsMake(0, 5, 2, 1); // Tweak the text position NSInteger width = ([backButton.titleLabel.text sizeWithFont:backButton.titleLabel.font].width + backButton.titleEdgeInsets.right +backButton.titleEdgeInsets.left); [backButton setFrame:CGRectMake(0, 0, width, 29)]; backButton.titleLabel.font = [UIFont boldSystemFontOfSize:13.0f]; [backButton addTarget:self action:@selector(yourSelector:) forControlEvents:UIControlEventTouchDown]; // Now add the button as a custom UIBarButtonItem UIBarButtonItem *backButtonItem = [[[UIBarButtonItem alloc] initWithCustomView:backButton] autorelease]; self.navigationItem.leftBarButtonItem = backButtonItem; 

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

结果

  • 使用对象库中的 工具栏栏button项

    组件

  • 在button的“ 属性”检查器中,使用后退button图像编辑图像部分

    属性检查器

完成!

我试图做同样的事情,但我想要后退button在导航栏中。 (我真的需要一个后退button,这将不仅仅是回去,所以我不得不使用leftBarButtonItem属性)。 我尝试了AndrewS的build议,但是在导航栏中,它看起来不像它应该的样子,因为UIButton是一种UIBarButtonItem。

但是我find了解决这个问题的方法。 实际上我只是在UIButton下放置一个UIView,并为UIBarButtonItem设置customView。 这里是代码,如果有人需要它:

 // initialize button and button view UIButton *backButton = [UIButton buttonWithType:101]; UIView *backButtonView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, backButton.frame.size.width, backButton.frame.size.height)]; [backButton addTarget:self action:@selector(backButtonTouched:) forControlEvents:UIControlEventTouchUpInside]; [backButton setTitle:@"Back" forState:UIControlStateNormal]; [backButtonView addSubview:backButton]; // set buttonview as custom view for bar button item UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:backButtonView]; self.navigationItem.leftBarButtonItem = backButtonItem; // push item to navigationbar items [self.navigationController.navigationBar setItems:[NSArray arrayWithObject:backButtonItem]]; 

为UIToolbar创build一个图像,在Photoshop中创build一个PNG,在任何地方都有任何颜色,它会将其设置为白色,而在alpha = 0的位置,则会使其独立。

SDK实际上是把你所做的图标放在边界上,而不需要做任何事情。

看,这是我在Photoshop中为我的前进button(显然交换后退button):

http://twitpic.com/1oanv

这就是它在Interface Builder中出现的样子

http://twitpic.com/1oaoa

解决scheme没有使用PNG。 基于这样的回答: 在iPhone TableView Cell的单元格的右侧添加小箭头

只要水平翻转UITableViewCell!

 UIButton *btnBack = [[UIButton alloc] initWithFrame:CGRectMake(0, 5, 70, 20)]; // Add the disclosure CGRect frm; UITableViewCell *disclosure = [[UITableViewCell alloc] init]; disclosure.transform = CGAffineTransformScale(CGAffineTransformIdentity, -1, 1); frm = self.btnBack.bounds; disclosure.frame = CGRectMake(frm.origin.x, frm.origin.y, frm.size.width-25, frm.size.height); disclosure.accessoryType = UITableViewCellAccessoryDisclosureIndicator; disclosure.userInteractionEnabled = NO; [self.btnBack addSubview:disclosure]; // Add the label UILabel *lbl = [[UILabel alloc] init]; frm = CGRectOffset(self.btnBack.bounds, 15, 0); lbl.frame = frm; lbl.textAlignment = NSTextAlignmentCenter; lbl.text = @"BACK"; [self addSubview:lbl]; 

如果你想避免自己绘制,你可以使用未公开的类:UINavigationButton与样式1.这当然可以阻止你的应用程序被批准… / John

那么,你不必为每一个尺寸有一个不同的button,你可以使用[UIImage stretchableImageWithLeftCapWidth:topCapHeight:] ,但我唯一发现的是自定义图像。

我有一个类似的问题,出来一个库PButton 。 而示例是像button的后退导航button,可以在任何地方使用,就像自定义button一样。

像这样的东西: 在这里输入图像描述

在Swift 3中的例子,在右上angular有一个上一个和下一个button。

 let prevButtonItem = UIBarButtonItem(title: "\u{25C0}", style: .plain, target: self, action: #selector(prevButtonTapped)) let nextButtonItem = UIBarButtonItem(title: "\u{25B6}", style: .plain, target: self, action: #selector(nextButtonTapped)) self.navigationItem.rightBarButtonItems = [nextButtonItem, prevButtonItem] 

迅速

 // create button var backButton = UIButton(type: 101) // left-pointing shape! backButton.addTarget(self, action: #selector(self.backAction), for: .touchUpInside) backButton.setTitle("Back", for: .normal) // create button item -- possible because UIButton subclasses UIView! var backItem = UIBarButtonItem(customView: backButton) // add to toolbar, or to a navbar (you should only have one of these!) toolbar.items = [backItem] navItem.leftBarButtonItem = backItem 

尝试这个。 我相信你不需要一个后退button图像来创build一个这样的。

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

这就是你所要做的:)

你为什么做这个? 如果你想看起来像一个导航栏的东西,使用UINavigationBar。

工具栏具有与之相关的特定视觉风格。 iPhone的人机界面指南状态:

工具栏出现在屏幕的底部边缘,并包含执行与当前视图中的对象相关的操作的button。

然后给出几个没有文字的大致方形图标的视觉例子。 我会敦促你跟随这个HIG。