导航条UIBarButtonItem添加图片,如何避免渲染

今天在学swift的时候发现的这个方法(表脸啊,明明是一起学swift的小伙伴先发现的啊),只需要一句代码(看看下面的这些代码,真是又忧伤又喜悦)

UIImage *image = [[UIImage imageNamed:@"lt_ic_my"] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal];
[btn setImage:image forState:UIControlStateNormal] ;
关键在 imageWithRenderingMode这个方法,看Apple注释
// Create a version of this image with the specified rendering mode. By default, images have a rendering mode of UIImageRenderingModeAutomatic.
- (UIImage *)imageWithRenderingMode:(UIImageRenderingMode)renderingMode NS_AVAILABLE_IOS(7_0);

大意是用指定的渲染模式创建image对象。默认情况下,图像的渲染模式uiimagerenderingmodeautomatic,我们需要的是UIImageRenderingModeAlwaysOriginal

讲真,我会一辈子记住这句代码...

====================================================================================================================================

今天做项目时碰到的需求:

导航条的leftBarButtonItem需要做一个未读提醒,效果如图所示:

贴心的UI妹子也给切图了,有未读一套图,读完另外一套。

熟悉导航条的都知道,导航条有个tintColor属性,当你不设置时恒为蓝色,而设置了就恒为你设置的颜色(例:白色),然后搞了半天,我就有些崩溃,以我的水平真的是没找到利用导航条属性来倔强的用UI妹子图的方法。

在下输了,于是发挥了中国人迂回解决问题的方法,舍弃UI妹子,单独创建一个Button来显示未读小红点,代码如下:

- (UIView *)myView {
    if (!_myView) {
        _myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 36, 36)];
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setAdjustsImageWhenHighlighted:NO];
        [btn addTarget:self action:@selector(enterPersonInfoPage) forControlEvents:UIControlEventTouchUpInside];
        [_myView addSubview:btn];
        [btn mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(_myView).insets(UIEdgeInsetsMake(0, 0, 0, 0));
        }];
        [btn setImage:[UIImage imageNamed:@"lt_ic_my"] forState:UIControlStateNormal];
        
        UIButton *unreadBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        self.unreadBtn = unreadBtn;
        [_myView addSubview:unreadBtn];
        [unreadBtn mas_makeConstraints:^(MASConstraintMaker *make) {
            make.top.equalTo(_myView).offset(3);
            make.right.equalTo(_myView).insets(UIEdgeInsetsZero);
            make.height.equalTo(8);
            make.width.equalTo(8);
        }];
    }
    return _myView;
}

设置导航条时直接:

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

当有未读消息时:

[self.unreadBtn setImage:[UIImage imageNamed:@"unread"] forState:UIControlStateNormal];
没有时:

[self.unreadBtn setImage:nil forState:UIControlStateNormal];

今天又找到一个方法:

在放图片的button下方放一个透明的button,代码如下:

- (UIView *)myView {
    if (!_myView) {
        _myView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 36, 36)];
        
        UIButton *clearBtn = [UIButton buttonWithType:UIButtonTypeCustom];
        [clearBtn setAdjustsImageWhenHighlighted:NO];
        [_myView addSubview:clearBtn];
        [clearBtn mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(_myView).insets(UIEdgeInsetsMake(0, 0, 0, 0));
        }];
        
        UIButton *btn = [UIButton buttonWithType:UIButtonTypeCustom];
        [btn setAdjustsImageWhenHighlighted:NO];
        [btn addTarget:self action:@selector(enterPersonInfoPage) forControlEvents:UIControlEventTouchUpInside];
        [_myView addSubview:btn];
        [btn mas_makeConstraints:^(MASConstraintMaker *make) {
            make.edges.equalTo(_myView).insets(UIEdgeInsetsMake(0, 0, 0, 0));
        }];
        [btn setImage:[UIImage imageNamed:@"lt_ic_my"] forState:UIControlStateNormal];
        self.myBtn = btn;
    }
    return _myView;
}

当有未读消息时:

[self.myBtn setImage:[UIImage imageNamed:@"lt_ic_my_unread"] forState:UIControlStateNormal];

没有时:

[UIImage imageNamed:@"lt_ic_my"] forState:UIControlStateNormal];

原因是导航条与放置图片的button中间隔了一层button,导航条tintColor渲染不到了,大概吧,原因找到了再贴。


至此,小马述一家之言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值