ios开发之--iOS 11适配:iOS11导航栏返回偏移

时间:2022-01-07 16:36:14

UIBarButtonItem 左边间隙过大,解决方案(ios11之前):

调用下面的方法,设置negativeSpacer.width = -15;就可以解决间隙过大的问题:

UIBarButtonItem *leftItem = [[UIBarButtonItem alloc] initWithCustomView:dayOrWeekButton];
self.navigationItem.leftBarButtonItem = leftItem;
[dayOrWeekButton release];
[leftItem release];
if ([[[[UIDevice currentDevice] systemVersion] substringToIndex:] intValue]>=)
{
UIBarButtonItem *negativeSpacer = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
negativeSpacer.width = -;
self.navigationItem.leftBarButtonItems = @[negativeSpacer, leftItem];
}else{
self.navigationItem.leftBarButtonItem = leftItem;
}

但是ios11以后,导航栏返回按钮偏移20像素,这个时候,上述方法就不行了,但是在之前是可以的,思路是这样的:写一个基类,在基类里面是把系统的导航给设置了下,并声明了几个方法,然后其他的控制器可以直接继承调用,当然也可以直接用一个view来自定义,这样也可以解决!

具体代码如下,判断系统版本号是为了更好的适配所以的机型(因为有好多人不喜欢升级系统):

//左侧按钮
-(void)addLeftBarButtonWithImg:(UIImage *)image
{
UIButton *leftBtn = [UIButton buttonWithType:UIButtonTypeCustom];
leftBtn.frame = CGRectMake(, , , );
[leftBtn setImage:image forState:UIControlStateNormal];
[leftBtn addTarget:self action:@selector(leftseaexitAction) forControlEvents:UIControlEventTouchUpInside]; if (GetVesion == 11.0) {
leftBtn.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
[leftBtn setImageEdgeInsets:UIEdgeInsetsMake(, -, , )];
UIBarButtonItem *leftBarBtnItem = [[UIBarButtonItem alloc]initWithCustomView:leftBtn]; self.navigationItem.leftBarButtonItem = leftBarBtnItem;
}else
{
UIBarButtonItem *leftBarBtnItem = [[UIBarButtonItem alloc]initWithCustomView:leftBtn];
self.navigationItem.leftBarButtonItem = leftBarBtnItem;
}
}
//右侧按钮
-(void)addRightBarButtonWithImg:(UIImage *)image r_hidden:(BOOL)r_hidden
{
_rightButton = [UIButton buttonWithType:UIButtonTypeCustom];
_rightButton.frame = CGRectMake(, , , );
_rightButton.hidden = r_hidden;
// _rightButton.backgroundColor = [UIColor grayColor];
[_rightButton setImage:image forState:UIControlStateNormal];
[_rightButton addTarget:self action:@selector(clickRightBtn:) forControlEvents:UIControlEventTouchUpInside]; if (GetVesion == 11.0) {
_rightButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentRight;
[_rightButton setImageEdgeInsets:UIEdgeInsetsMake(, , , -)];
UIBarButtonItem *rightBarBtn = [[UIBarButtonItem alloc]initWithCustomView:_rightButton];
self.navigationItem.rightBarButtonItem = rightBarBtn;
}else
{
UIBarButtonItem *rightBarBtnItem = [[UIBarButtonItem alloc]initWithCustomView:_rightButton];
self.navigationItem.leftBarButtonItem = rightBarBtnItem;
} }
//右侧为文字item的情况

- (void)addRightBarButtonItemWithTitle:(NSString *)itemTitle action:(SEL)action

{

    UIButton *rightbBarButton = [[UIButtonalloc]initWithFrame:CGRectMake(,,,)];

    [rightbBarButton setTitle:itemTitle forState:(UIControlStateNormal)];

    [rightbBarButton setTitleColor:kDarkOneColorforState:(UIControlStateNormal)];

    rightbBarButton.titleLabel.font = [UIFontsystemFontOfSize:];

    [rightbBarButton addTarget:selfaction:actionforControlEvents:(UIControlEventTouchUpInside)];

    if (GetVesion == 11.0) { 

          rightbBarButton.contentHorizontalAlignment =UIControlContentHorizontalAlignmentRight; 

          [rightbBarButton setTitleEdgeInsets:UIEdgeInsetsMake(,,, -)]; 
} else
{
//这里适配以前的版本写老方法就可以
} self.navigationItem.rightBarButtonItem = [[UIBarButtonItemalloc]initWithCustomView:rightbBarButton]; }
//左侧为文字item的情况
- (void)addLeftBarButtonItemWithTitle:(NSString *)itemTitle action:(SEL)action
{
UIButton *leftbBarButton = [[UIButtonalloc]initWithFrame:CGRectMake(,,,)]; [leftbBarButton setTitle:itemTitleforState:(UIControlStateNormal)]; [leftbBarButton setTitleColor:kDarkOneColorforState:(UIControlStateNormal)]; leftbBarButton.titleLabel.font = [UIFontsystemFontOfSize:]; [leftbBarButton addTarget:selfaction:actionforControlEvents:(UIControlEventTouchUpInside)]; if (GetVesion == 11.0) { leftbBarButton.contentHorizontalAlignment =UIControlContentHorizontalAlignmentLeft; [leftbBarButton setTitleEdgeInsets:UIEdgeInsetsMake(, - *kScreenWidth/375.0,,)];
} else
{
//这里适配以前的版本写老方法就可以
} self.navigationItem.leftBarButtonItem = [[UIBarButtonItemalloc]initWithCustomView:leftbBarButton]; }
//右侧两个图片item的情况

- (void)addRightTwoBarButtonsWithFirstImage:(UIImage *)firstImage firstAction:(SEL)firstAction secondImage:(UIImage *)secondImage secondAction:(SEL)secondAction

{

    UIView *view = [[UIViewalloc]initWithFrame:CGRectMake(,,,)];

    view.backgroundColor = [UIColorclearColor];

    UIButton *firstButton = [UIButtonbuttonWithType:UIButtonTypeCustom];

    firstButton.frame = CGRectMake(, , , );

    [firstButton setImage:firstImageforState:UIControlStateNormal];

    [firstButton addTarget:selfaction:firstActionforControlEvents:UIControlEventTouchUpInside];

    if (GetVesion == 11.0) { 

       firstButton.contentHorizontalAlignment =UIControlContentHorizontalAlignmentRight; 

       [firstButton setImageEdgeInsets:UIEdgeInsetsMake(,,, - * kScreenWidth/375.0)]; 

} else
{
//这里适配以前的版本写老方法就可以
} [view addSubview:firstButton]; UIButton *secondButton = [UIButtonbuttonWithType:UIButtonTypeCustom]; secondButton.frame = CGRectMake(, , , ); [secondButton setImage:secondImageforState:UIControlStateNormal]; [secondButton addTarget:selfaction:secondActionforControlEvents:UIControlEventTouchUpInside]; if (GetVesion == 11.0) { secondButton.contentHorizontalAlignment =UIControlContentHorizontalAlignmentRight; [secondButton setImageEdgeInsets:UIEdgeInsetsMake(,,, - * kScreenWidth/375.0)]; } [view addSubview:secondButton]; UIBarButtonItem *rightBarButtonItem = [[UIBarButtonItemalloc]initWithCustomView:view]; self.navigationItem.rightBarButtonItem = rightBarButtonItem; }

备注:千万别忘了,适配ios11之前的系统,最后在上面的if方法里面要适配以前的版本!

然后在控制器里面,直接 [self  方法]调用即可,如果坐标不合适可以自行处理,如果你的需求是三个四个item按钮,可以仿照上边两个item按钮的方法,自行处理。