我喜欢在一个UIToolbar
.中创建一个"后退"左箭头边框按钮.
据我所知,获得其中一个的唯一方法是保留UINavigationController
默认设置,并使用一个左栏项.但我无法找到创建一个作为一个UIBarButtonItem
,所以我不能在标准中创建一个UIToolbar
,即使它们与UINavigationBar
s 非常相似.
我可以用按钮图像手动创建它,但我无法在任何地方找到源图像.它们具有alpha通道边缘,因此截屏和切割不会得到非常多样化的结果.
除了我打算使用的每种尺寸和配色方案的截图之外的任何想法?
更新:请停止躲避问题并建议我不应该问这个并且应该使用UINavigationBar
.我的应用程序是Instapaper Pro.它只显示一个底部工具栏(为了节省空间和最大化可读内容区域),我希望在底部放置一个左箭头形状的后退按钮.
告诉我,我不应该这样做不是一个答案,当然不值得赏心悦目.
我使用了以下来自http://www.teehanlax.com/blog/?p=447的 psd
http://www.chrisandtennille.com/pictures/backbutton.psd
然后我创建了一个自定义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字符来完成工作要容易得多.您可以通过Google搜索Unicode三角形或Unicode箭头来查看箭头.从iOS6开始,Apple将角色更改为带边框的表情符号字符.要禁用边框,我添加了0xFE0E Unicode变体选择器.
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的按钮.
对于完整的字符列表,请搜索Google以获取Unicode字符以及您想要的内容.这是Black Left-Pointing Triangle的条目.
警告:有报告称这不适用于iOS 6.这可能仅适用于旧版本的操作系统.显然至少有一个开发者因使用这个技巧而拒绝他们的应用程序(参见评论).使用风险由您自己承担.使用图像(见上面的答案)可能是一个更安全的解决方案.
这可以在不使用sekr1t按钮类型101添加自己的图像文件的情况下完成,以获得正确的形状.对我来说,诀窍是弄清楚我可以initWithCustomView
用来创造BarButtonItem
.我个人需要这个动态导航栏而不是一个toolbar
,但我用工具栏测试它,代码几乎相同:
// 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 blah,阅读HIG,不要使用未记录的功能,以及所有这些.只有六种支持的按钮类型,这不是其中之一.
首先,你必须找到后退按钮的图像.我使用了一个名为Extractor的漂亮应用程序,可以从iPhone中提取所有图形.在iOS7中,我设法检索被调用的图像UINavigationBarBackIndicatorDefault
并且它是黑色的,因为我需要一个红色调,我使用Gimp将颜色更改为红色.
编辑:
正如btate在评论中提到的那样,没有必要使用图像编辑器来改变颜色.以下代码应该可以解决问题:
imageView.tint = [UIColor redColor]; imageView.image = [[UIImage imageNamed:@"UINavigationBarBackIndicatorDefault"] imageWithRenderingMode:UIImageRenderingModeAlwaysTemplate];
然后我创建了一个视图,其中包含带有该箭头的imageView,带有自定义文本的标签,并且在视图的顶部,我有一个带动作的按钮.然后我添加了一个简单的动画(淡入淡出和翻译).
以下代码模拟后退按钮的行为,包括动画.
-(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{ }
编辑:
在我看来,更好的方法是使用手势识别器,而不是添加按钮.
UITapGestureRecognizer* tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(handleBack:)]; [view addGestureRecognizer:tap]; [view setUserInteractionEnabled:YES];
我不确定这是否可行,但您可以尝试创建一个UINavigationController
使用默认设置来创建按钮,在导航控制器的子视图层次结构中找到按钮,调用removeFromSuperview
它,销毁导航控制器,然后将按钮添加为工具栏的子视图.您可能还需要retain
在调用之前使用该按钮removeFromSuperview
(然后release
在将其添加为工具栏的子视图后将其添加)以避免在此过程中将其取消分配.
要使用箭头非常接近的UIButton(我不是设计师;)到iOS 7系统后退箭头:
标准:
Apple SD Gothic Neo
在Xcode中:
专注于按钮的标题值字段(或具有文本内容的任何其他视图/控件)
打开编辑 - >特殊字符
选择圆括号组,然后双击"<"字符
将字体更改为:Apple SD Gothic Neo,Regular,所需尺寸(例如20)
根据需要改变颜色
Ref @ staticVoidMan对iOS 7上类似Back的箭头的回答
如果您不想打扰图像文件,可以使用以下代码在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;
适合我.当我有更多标签然后可以放在标签栏上时,我使用了这个,并且从"更多"推出的视图控制器覆盖了viewDidLoad中的leftBarButtonItem.