iOS7 UI兼容 导航栏按钮边框 UINavigationItem left and right padding

本文提供了一种解决iOS7版本兼容性的方法,通过重写UINavigationItem的setLeftBarButtonItem和setRightBarButtonItem方法,使得项目在iOS7及之前版本下也能正常运行。并展示了如何添加自定义按钮,确保兼容性和用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

http://www.cnblogs.com/maxfong/p/3375167.html

iOS7之前的UI为:

而在iOS7中,由于设计方面的原因,使得UI变为:

 

修改的方法重写UINavigationItemsetLeftBarButtonItemsetRightBarButtonItem方法,使之与之前版本兼容;

代码如下:

@interface UINavigationItem (margin)

@end
复制代码
@implementation UINavigationItem (margin)

#if __IPHONE_OS_VERSION_MAX_ALLOWED > __IPHONE_6_1
- (void)setLeftBarButtonItem:(UIBarButtonItem *)_leftBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
        negativeSeperator.width = -12;
        
        if (_leftBarButtonItem)
        {
            [self setLeftBarButtonItems:@[negativeSeperator, _leftBarButtonItem]];
        }
        else
        {
            [self setLeftBarButtonItems:@[negativeSeperator]];
        }
        [negativeSeperator release];
    }
    else
    {
        [self setLeftBarButtonItem:_leftBarButtonItem animated:NO];
    }
}

- (void)setRightBarButtonItem:(UIBarButtonItem *)_rightBarButtonItem
{
    if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)
    {
        UIBarButtonItem *negativeSeperator = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFixedSpace target:nil action:nil];
        negativeSeperator.width = -12;
        
        if (_rightBarButtonItem)
        {
            [self setRightBarButtonItems:@[negativeSeperator, _rightBarButtonItem]];
        }
        else
        {
            [self setRightBarButtonItems:@[negativeSeperator]];
        }
        [negativeSeperator release];
    }
    else
    {
        [self setRightBarButtonItem:_rightBarButtonItem animated:NO];
    }
}

#endif
@end
复制代码

项目源码不做任何修改,问题解决;

添加Button:

UIBarButtonItem *leftBarItem = [[UIBarButtonItem alloc] initWithCustomView:btnBack];
self.navigationItem.leftBarButtonItem = leftBarItem;
[leftBarItem release];

 

博文地址:http://www.cnblogs.com/maxfong/p/3375167.html

分类:  iphone
标签:  iOSiOS7UINavigationItem
« 上一篇: iOS objective-C retainCount, OC计数器的思考
» 下一篇: 通过UIView获取UIViewController
posted @  2013-10-17 22:32  Maxfong 阅读( 4000) 评论( 8编辑  收藏

  
#1楼 2013-10-31 17:16  hhb19900618   
比较高明
  
#2楼 [ 楼主2013-10-31 18:56  Maxfong   
@hhb19900618
:)
  
#3楼 2013-11-28 11:32  诸神De黄昏曲   
如果是设置 rightBarButtons呢? 这个该这么弄呢?
  
#4楼 [ 楼主2013-11-28 17:56  Maxfong   
@诸神De黄昏曲
如果一定是rightBarButtons,我建议:修改为rightBarButton,原本的Buttons添加到一个UIview中,进行设置;
当然,个人觉得有必要换设计,更好的兼容iOS7!!!!
  
#5楼 2013-11-28 18:10  诸神De黄昏曲   
@Maxfong
恩 重写setRightBarButtonItems 的话要注意什么呢? 我对ios的底层不是很了解。 里面大概的格式是什么样子的?
  
#6楼 [ 楼主2013-11-28 19:10  Maxfong   
@诸神De黄昏曲
setRightBarButtonItems和setRightBarButtonItem不一样,没办法以这种形式修改;
如果你一定需要,我建议:
1.重新创建一个类,继承:UIBarButtonItem,然后- setMyRightBarButtonItems这种心思,最后调用[super setRightBarButtonItems]的方式;缺点是项目需要全部修改;
2.自己实现方法,然后使用OC的消息替换方式,替换方法,不过写起来可能有点复杂,这个仅供参考吧!!class_replaceMethod!!!

至于里面的格式,我还没见过,呵呵!!不过我猜测大概是
[self willChangeValueForKey: @"leftBarButtonItem"];
[_leftBarButtonItem release];
_leftBarButtonItem = [leftBarButtonItem_ retain];
[self didChangeValueForKey: @"leftBarButtonItem"];
这种样子,具体的使用,应该到UINavigationBar内!!
  
#7楼 2013-11-28 22:59  诸神De黄昏曲   
嗯 好的. 谢谢讲解啊. 呵呵
  
#8楼 2014-08-22 19:10  a3632   
直接重写系统的方法,不是很好,会导致打开系统的控件界面也发生变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值