iOS 自定义backBarButtonItem leftBarButtonItem

1. backBarButtonItem 

iOS 自定义backBarButtonItem leftBarButtonItem_第1张图片

根据官方文档,Discussion里:

When configuring your bar button item, do not assign a custom view to it; the navigation item ignores custom views in the back bar button anyway.

译文:当你自定义你的BarButtonItem时,不要将Custom View赋值给它(即BackBarButtonItem)。当你对BackBarButtonItem赋了值时,导航的项(Item)会忽略掉CustomView。

所以,我们没法按照老样子,像下面这样,给BackBarButtonItem赋值:

-(void) showBackBtn:(BOOL) bShow{
    if(bShow){
        UIImage* barImg = [UIImage imageNamed:@"DirectionalArrow_phone"];
	UIButton* btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 44)];
	[btn setImage:scaleImage forState:UIControlStateNormal];
	UIBarButtonItem *backButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];
        self.navigationItem.backBarButtonItem = backButtonItem;
    }
}


 
  

上述代码,运行后,就像没设置一样,就像文档中描述的,它被忽略掉了。

当然,这段代码,它时错误的,却在网上很常见,原因很简单,懒惰的程序员,想当然的给出了错误的解决方案。

解决方案:

-(void) showBackBtn:(BOOL) bShow{
    if(bShow){
        UIImage* barImg = [UIImage imageNamed:@"DirectionalArrow_phone"];
        self.navigationItem.backBarButtonItem = [[UIBarButtonItem alloc]initWithImage:barImg style:UIBarButtonItemStylePlain target:self action:nil];
    }
}
当然实际上,我没有这么做,因为它在iOS6 与iOS7 有不同的表现,而这并不是我们所期望的。


1. leftBarButtonItem

leftBarButtonItem就简单多了,它不存在刚才我们在BackBarButtonItem里所遇到的奇葩规定。

但,真的如此简易吗?

为了表现一致,如果你是足够细心的程序员,你会发现在iOS6 与 iOS7上,它有10像素的偏差。

在这里,我直接提供了解决方案的代码。

-(void) showLeftBtn{

    UIButton *btn = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 40, 44)];
    [btn setTitle:@"" forState:UIControlStateNormal];
    
    UIImage* btnImg = [UIImage imageNamed:@"DirectionalArrow_phone"];
    
    CGSize size = CGSizeMake(20.0f, 20.0f);
    UIImage*scaleImage = [UIImage resizedImageWithImage:btnImg size:size];
    [btn setImage:scaleImage forState:UIControlStateNormal];
    
    [btn setTitleEdgeInsets:UIEdgeInsetsMake(0.0, 0.0, 0.0, 0.0)];
    
    UIBarButtonItem *btnLeft = [[UIBarButtonItem alloc] initWithCustomView:btn];
    UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]
                                       initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace
                                       target:nil action:nil];
    IF_PRE_IOS7(
                negativeSpacer.width = 0;
                )
    
    IF_IOS7_OR_GREATER(
                       negativeSpacer.width = -10;
                       )
    self.navigationItem.leftBarButtonItems = [NSArray arrayWithObjects:negativeSpacer, btnLeft, nil];
}

 

OK,我们到此完整的叙述了在自定义backBarButtonItem leftBarButtonItem中遇到的问题,及解决方案。
有兴趣,可以关注我微博 @Taligent
更希望可以推荐给我好的文章,共同进步...



你可能感兴趣的:(iOS)