前言:

 

iOS7中导航栏按钮图片会有左右偏移,比如leftBarButtonItem可能会向右偏移10几个像素。


解决办法1:

自定义一个Button,代码如下:


1



@interface BarItemButton : UIButton



2



 



3



@end




实现如下方法:


01



- (UIEdgeInsets)alignmentRectInsets



02



{



03



    UIEdgeInsets insets;



04



    if([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)



05



    {



06



        if([self isLeftButton])



07



        {



08



            insets = UIEdgeInsetsMake(0, 13, 0, 0);



09



        }



10



        else



11



        {



12



            insets = UIEdgeInsetsMake(0, 0, 0, 13);



13



        }



14



    }



15



    else



16



    {



17



        insets = UIEdgeInsetsZero;



18



    }



19



     



20



    returninsets;



21



}



22



 



23



- (BOOL)isLeftButton



24



{



25



    returnself.frame.origin.x < (self.superview.frame.size.width / 2);



26



}



然后把这样一个Button作为left button,代码如下:


1



    UIButton* btn = [BarItemButton buttonWithType:UIButtonTypeCustom];



2



    btn.frame = CGRectMake(0, 0, 45, 40);



3



    [btn setImage:[UIImage imageNamed:@"come_back.png"] forState:UIControlStateNormal];



4



[btn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];



5



    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];



这样可以解决问题,但并不完美,

如果我们我们从一个controller跳转到这样一个controller中:

[self.navigationController pushViewController:[[TestViewController alloc] init] animated:YES];

那么你会发现这个left button位置一开始并不正确,然后通过一个动画移动到我们希望的位置上。


大致效果是这样,controller启动时候有一个明显的动画,蓝色的view在移动,而导航栏上的button也在移动

 

启动完成后button才回到正确的位置,如下图

 


而这个动画显然不是我们需要的!


解决办法2:

去掉button的alignmentRectInsets方法实现,

将left button设置代码修改如下:


1



  self.view.backgroundColor = [UIColor blueColor];



2



    UIButton* btn = [BarItemButton buttonWithType:UIButtonTypeCustom];



3



    btn.frame = CGRectMake(0, 0, 45, 40);



4



    [btn setImage:[UIImage imageNamed:@"come_back.png"] forState:UIControlStateNormal];



5



    btn.imageEdgeInsets = UIEdgeInsetsMake(0, -13, 0, 0);



6



    [btn addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];



7



    self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:btn];




这里最重要是的我们设置了button的imageEdgeInsets,让它在构造的时候就在-13这个位置固定住,而不是layout的时候才移动到我们希望的位置上。